XSLT i możliwe alternatywy [zamknięte]

15

Przyjrzałem się XSLT do przekształcania jednego pliku XML w inny (HTML itp.). Teraz, gdy widzę, że XSLT ma zalety (będąc znormalizowanym i używanym narzędziem), jestem niechętny z kilku powodów

  • Procesory XSLT wydają się być dość duże / wymagają dużych zasobów
  • XML jest złym zapisem do programowania i na tym właśnie polega XSLT.

Nie chcę tutaj trollować XSLT, ale chcę tylko wskazać, czego nie lubię, aby dać ci wyobrażenie o tym, czego oczekiwałbym od alternatywy.

Mając trochę doświadczenia w Lispie, zastanawiam się, czy istnieją lepsze sposoby transformacji struktury drzewa w oparciu o pewne seplenienie. Widziałem odniesienia do DSSSL, niestety większość linków o DSSSL jest martwa, więc zobaczenie kodu, który to ilustruje, jest już trudne. Czy DSSSL jest nadal w użyciu? Pamiętam, że raz zainstalowałem openjade podczas sprawdzania dokumentacji docbook.

Post na blogu Jeffa Atwooda sugeruje używanie Ruby zamiast XSLT.

Czy są jakieś rozsądne sposoby wykonywania transformacji XML podobnych do XSLT w języku programowania innym niż XML? Byłbym otwarty na wejście

  • Przydatne biblioteki dla języków skryptowych, które ułatwiają transformacje XML
  • zwłaszcza (ale nie wyłącznie) języki transformacji podobne do seplenienia, Ruby itp.

Kilka rzeczy, które do tej pory znalazłem:

wirrbel
źródło
Używam HXT i Haskell dość często, jest to bardzo przyjemne
Daniel Gratzer
5
Szczerze mówiąc, to nie Jeff Atwood popiera Ruby, cytuje Martina Fowlera, który woli Ruby. Oryginalny post Fowlera znajduje się tutaj: martinfowler.com/bliki/MovingAwayFromXslt.html I został napisany 10 lat temu w 2003 r. - Myślę, że XSLT 2.0 wyszedł w 2007 r. I zawiera wiele ulepszeń, a XPath 2.0 w 2010 r.
FrustratedWithFormsDesigner

Odpowiedzi:

18

Trudno jest oceniać technologie, jeśli nie masz do nich głębokiego doświadczenia, ale oczywiście to właśnie wtedy musisz podejmować decyzje, więc nie ma prostej odpowiedzi na ten dylemat.

Przytaczasz dwie obawy: wydajność i użyteczność. Spróbuję rozwiązać oba poniżej.

Po pierwsze, wydajność. Wydajność kursu zależy nie tylko od języka, ale także od implementacji, a także od wiedzy użytkowników. Różne procesory XSLT mogą się znacznie różnić pod względem wydajności, a ten sam procesor może się bardzo różnić w zależności od tego, w jaki sposób jest używany (na przykład w Saksonii ludzie, którzy mają problemy z wydajnością, bardzo często używają go z DOM, co jest złym połączeniem , a wydajność może wzrosnąć dziesięciokrotnie, jeśli zamiast tego użyjesz natywnego modelu drzewa w Saksonii). Pierwszą radą jest, aby nie brać udziału w pogłosie, mierzyć; a druga rada to upewnienie się, że osoba dokonująca pomiaru ma wystarczające doświadczenie, aby nie popełniać głupich błędów. Łatwiej powiedzieć niż zrobić.

Z grubsza można podzielić zadania transformacji na dwie kategorie: proste i złożone. W przypadku prostych transformacji przy dobrym procesorze XSLT cały czas jest analizowany i serializowany, a czas przetwarzania XSLT prawie nie pojawia się na zdjęciu. Ponieważ każda inna technologia będzie wiązać się z takimi samymi kosztami analizy i serializacji, wybór technologii transformacji nie zrobi dużej różnicy (z wyjątkiem być może bardzo bardzo niskiego poziomu kodowania za pomocą przesyłania strumieniowego, ale niewiele osób może sobie pozwolić na programowanie czas i umiejętności potrzebne do wdrożenia tego). W przypadku złożonych transformacji dużych dokumentów zaczynają się pojawiać te same problemy, co w przypadku programowania SQL: osiągnięcie dobrej wydajności wymaga dobrej interakcji między umiejętnościami i wiedzą programisty a możliwościami optymalizatora. Podobnie jak w przypadku SQL, to „ w tak wysokim języku bardzo łatwo jest napisać kilka prostych instrukcji, które powodują, że procesor musi wykonać bardzo dużo pracy. Ale tak jak w przypadku SQL, programiści, którzy wiedzą, co robią, zrobią znacznie lepiej niż nowicjusze.

Po drugie, użyteczność. Oparta na XML składnia XSLT jest bardzo odrażająca dla wielu osób, które po raz pierwszy zetknęły się z tym językiem. Ale istnieją dobre powody i realne korzyści z robienia tego w ten sposób: istnieje argument „szablon”, że duża część kodu składa się z XML, który ma zostać zapisany w dokumencie wynikowym, a najlepszym sposobem na zapisanie XML jest XML. I jest argument „refleksji”; w dużych złożonych systemach bardzo często można znaleźć arkusze stylów, które generują arkusze stylów. Następnie jest argument „narzędzia”; jeśli jesteś w sklepie XML, prawdopodobnie masz dużo narzędzi XML, takich jak edytory sterowane składnią, i dobrze jest móc korzystać z tych samych narzędzi do obsługi programów i danych. Wady okazują się dość kosmetyczne w porównaniu: tam ” s liczba naciśnięć klawiszy związanych z edycją (łatwa do naprawienia za pomocą dobrego narzędzia do edycji) i istnieje szczegółowość kodu (zmniejszająca jego czytelność). Szczegółowość jest znacznie zmniejszona w XSLT 2.0 dzięki wprowadzeniu takich funkcji, jak wyrażenia regularne i funkcje arkuszy stylów: wiele arkuszy stylów jest zmniejszonych do połowy lub jednej trzeciej, gdy w pełni korzystają z XSLT 2.0.

Twoja wzmianka o DSSSL wywołuje u mnie cierpki uśmiech. Nigdy nie korzystałem z DSSSL, ale historie, które słyszałem, były niepotrzebne, ponieważ jego składnia była tajemna i niezwiązana ze składnią danych (SGML). Zastosowanie składni XML dla XSLT było silnie motywowane doświadczeniem z DSSSL.

Są ludzie, którzy kochają XSLT i są ludzie, którzy go nienawidzą. Nic dziwnego, że ci, którzy często go używają, należą do pierwszej kategorii. Ci, którzy go nie lubią, to na ogół ci, którzy nie nauczyli się „myśleć w sposób XSLT”. Można argumentować, że język programowania nie powinien wpływać na twój sposób myślenia, ale tak jest: pisanie w języku opartym na regułach ma inny sposób myślenia niż pisanie w języku imperatywnym. Pierwszą reakcją wielu programistów jest to, że czują się mniej pod kontrolą (opisując problem, zamiast mówić komputerowi, co robić krok po kroku). Jest to bardzo podobne do reakcji, którą obserwowałeś, kiedy ludzie po raz pierwszy zostali zapoznani z SQL. W dzisiejszych czasach ludzie uczą się SQL wcześniej w swojej karierze, więc wymagana jest mniejsza korekta mentalna.

Ostatecznie powinieneś wybrać technologię opartą na obiektywnych, mierzalnych kryteriach, a nie na reakcjach miłości / nienawiści. Te pomiary są trudne. Ale wiele osób używa XSLT bardzo intensywnie i bardzo skutecznie, więc nie ma wątpliwości, że można to zrobić.

Michael Kay
źródło
2
Częstszym terminem „język oparty na regułach” jest język deklaratywny.
Daniel Gratzer,
@Michael Kay - Dobrze powiedziane. Osobiście uwielbiam XSLT i używam go z C #. Ponadto używam go z XSL-FO do tworzenia dokumentów PDF. XSLT jest potężny, bardzo potężny, pozwalając mi szybko konwertować duże ilości danych na HTML, XSL-FO, XML lub Text.
PhillyNJ,
3

Bez dodatkowych informacji o kontekście trudno jest odpowiedzieć.

Nadal nie rozumiem, dlaczego nie chcesz używać XSLT. To odpowiednie narzędzie do pracy i potężne. Odbywa się to w celu przekształcenia jednego pliku XML w inny.

Procesory XSLT wydają się być dość duże / wymagają dużych zasobów

Czy masz twarde dane, aby to wesprzeć? Czy wdrożyłeś rozwiązanie przy użyciu XSLT i odkryłeś, że XSLT stanowi wąskie gardło, które uniemożliwia dostarczenie produktu przy spełnieniu wszystkich niefunkcjonalnych wymagań związanych z wydajnością?

Bez danych statystycznych i profilowania nie można racjonalnie stwierdzić, że dane rozwiązanie nie będzie działać. Czy wymagania niefunkcjonalne są wystarczająco uzasadnione? Czy wolisz marnować, powiedzmy, dziesięć dni pracy programistów, aby zyskać kilkaset milisekund, zastępując XSLT inną alternatywą? Czy warto

XML jest złym zapisem do programowania i na tym właśnie polega XSLT.

Więc chcesz przekształcić jeden XML w inny, ale nie chcesz używać XSLT, ponieważ „XML to zły zapis”?

Jeśli fakt, że używasz XML jako pewnego rodzaju języka programowania, który cię tak denerwuje, nie postrzegaj go jako programowania, ale raczej jako zbiór reguł transformacji.

Nie musisz nawet pisać XSLT ręcznie. Istnieje wiele edytorów ETL, które umożliwiają graficzne odwzorowanie jednego pliku XML na inny: żadne programowanie nie jest wymagane. Niektóre z nich używają XSLT jako danych wyjściowych.

Arseni Mourzenko
źródło
Napotkałem problemy z zasobami w arkuszach opartych na XSLT, zostały one utworzone za pomocą narzędzia graficznego, ale przestało działać z większymi plikami.
wirrbel 10.09.13
1
wtedy prawdopodobnie masz problemy z twoimi XSLT filenie XSLT Transformationssamymi
Malachi
Teraz nie potępiam XML, w rzeczywistości uważam, że jest odpowiedni do reprezentacji danych (szczególnie do znaczników). Jako „język programowania” - a XSLT jest językiem programowania specyficznym dla domeny - jest niewygodny. <xsl :okolwiek> Tagi, języki metalowe (takie jak xpath, notacja $ itp.) w atrybutach zapytania, wszystko, co nie jest odwzorowane na XML, jest umieszczane w cudzysłowach atrybutów. W przypadku wrażenia reprezentację s-ekspresji XML: blog.getprismatic.com/blog/2013/1/22/... w taki XML i oddalone i proglang seemless pracy
wirrbel
1

Jeśli używasz XSLT do generowania XML na podstawie surowego XSLT i niektórych parametrów, które przekazujesz do silnika XSLT, wówczas stosowanie XML szablonów jest znacznie łatwiejsze do zrozumienia i utrzymania.

Byłem przy projekcie, w którym Wąsy został użyty do zastąpienia XSLT, w wyniku czego powstały znacznie prostsze podstawowe pliki XML, które każdy mógł edytować i dostosowywać, a nie prace nad projektem przekazywane jednej lub dwóm dzielnym duszom, które siedziały w całkowitej ciszy z kroplami potu spływającymi ...

Podejście szablonowe nie nadaje się do użycia, gdy podstawowy XML jest również osobnymi ważnymi danymi, a XSLT służy do zapewnienia alternatywnej reprezentacji lub wyciągu ze źródłowego XML.

Michael Shaw
źródło
czy mógłbyś wyjaśnić więcej na temat tego, co robi i dlaczego polecasz to jako odpowiedź na zadane pytanie? „Tylko odpowiedzi” nie są mile widziane na Stack Exchange
gnat
1
sprawdził odpowiedź zgodnie z Twoją opinią
Michael Shaw
0

XML nie jest językiem programowania

XML to sposób na transfer / transport danych.
to, co robi instrukcja XSLT, to użycie Xpath do zapytania danych w określony sposób i umieszczenia ich w innym obiekcie / dokumencie transportu danych.

I / LUB

XSLT może przekształcić plik XML w HTML, który jest innym sposobem wyświetlania / transportu danych zawartych w dokumencie XML.

jeśli chcesz zmienić XML lub utworzyć dokument XML, możesz użyć dowolnej liczby języków: C #, VB, Ruby itp.

zwykle kiedy używasz pliku XSLT do transformacji dokumentu XML, nadal masz oryginalny dokument XML, tak naprawdę nie zmieniasz oryginalnego dokumentu, naprawdę tworzysz nowy.

Malachiasz
źródło
1
Wikipedia mówi: „XSLT jest kompletnym językiem Turinga, co oznacza, że ​​może określać dowolne obliczenia, które może wykonać komputer”. Nigdy nie mówiłem, że XML jako taki jest językiem programowania.
wirrbel 10.09.13
powiedziałeś, że „XML jest złym zapisem do programowania” w używanych przeze mnie językach programowania możesz dość łatwo pobierać dane z plików XML. XSLT zyskuje na popularności, ponieważ może wykonywać wiele obliczeń i wyrzucać te dane do innego obiektu / dokumentu transportu danych. to jest jak SQL na SQL Server, może robić wiele rzeczy, ale w większości jest to back-end, a nie front-end. SQL, podobnie jak XSLT, wysyła zapytanie do danych w określony sposób, ale nigdy nie chcesz podawać wyników tego zapytania jako raportu, chcesz wysłać informacje do konstruktora raportów
Malachi
2
XSLT nie sprawdza danych, XPATH wykonuje zapytania. Czy XSLT nie jest językiem deklaratywnym, który definiuje instrukcje dotyczące analizowanego pliku XML?
PhillyNJ,
XSLT definiuje reguły transformacji na podstawie wzorców, dla których może używać Xpath. To znaczy, możesz mieć konstrukcje programowania na wysokim poziomie, takie jak xsl:for-each xsl:apply-templates, xsl:if xsl:call-template xsl:value-ofaby zdefiniować reguły transformacji.
wirrbel,
1
@PhilVallone Zgadzam się. Myliłem się tam wirrbel, nie będę się z tobą kłócił o to, czym jest XSLT / XSL, a jeśli nie, jeśli chcesz przekształcić dokument XML w inny dokument XML, będziesz chciał użyć XSLT / XSL.
Malachi
0

Pracowałem nad wieloma systemami przetwarzania XML, które łączą biblioteki XSLT z Javą lub C ++ dla części, w których XSLT nie jest tak dobry. Istnieją biblioteki, które osiągają bardzo dobrą wydajność XSLT nawet w przypadku plików XML 20 MB, jednak XSLT ma pewne ograniczenia dotyczące kontekstu, zmiennych i naprawdę złożonych wzorców ciągów. Każdy system, nad którym pracowałem, miał kilka rzeczy do zrobienia w Javie / C ++, ponieważ kontekst był ważny lub pomocne było pewne złożone wyrażenie regularne. Moja na wynos jest to, że XSLT plus dodatkowy kod w wybranym języku to dobry sposób na transformację XML.

Michael Shopsin
źródło