Pisanie skutecznego XSLT

Jakie są zasady i wzorce, które wchodzą w pisanie skutecznego XSLT?

Kiedy mówię "skuteczny" mam na myśli to, że jest

  1. dobrze zorganizowany i czytelny
  2. proste, zwięzłe
  3. wydajny (tzn. ma dobrą wydajność)

Krótko mówiąc, Szukam najlepszych praktyk dla XSLT.

Już widziałem pytanie dotyczące efektywności , ale efektywny kod traci swoją wartość, jeśli nie możesz zrozumieć, co robi.

 12
Author: Community, 2009-04-12

5 answers

Myślę, że dobrym sposobem na odpowiedź na to pytanie byłoby podejście do niego z drugiej strony. Jakie praktyki sprawiają, że XSLT jest nieskuteczny i dlaczego?

Niektóre z rzeczy, które widziałem, które skutkują nieskutecznością XSLT:

  1. Nadużywanie for-each. wszyscy to mówili; mówię to jeszcze raz. Uważam, że for-each jest często znakiem, że programista próbuje zastosować tradycyjne techniki programowania w deklaratywnym język.

  2. Niedouczony XPath. wiele złych XSLT, które widziałem, istnieje tylko dlatego, że programista nie rozumiał predykatów, specyfikacji osi, position() i current(), więc zaimplementował logikę używając zamiast tego konstruktów XSLT.

  3. Niedostateczne wykorzystanie metadanych. możesz czasami wyeliminowaćogromną Ilość XSLT, dostarczając swoim transformatom metadane.

  4. Niedostateczne wykorzystanie wstępnej obróbki. Jeśli, dla przykład, dokument XML zawiera dane, które muszą być parsowane za pomocą manipulacji łańcuchem XSLT, często dużo łatwiej jest wykonać wszystkie parsowanie poza XSLT i albo dodać parsowane wyniki do XML lub przekazać parsowane wyniki jako argument do transform. Widziałem kilka niezwykle nieosiągalnych implementacji logiki biznesowej XSLT, które byłyby trywialne do zaimplementowania w C # lub Pythonie.

Największy problem, na który wpadam w moim własnym świecie XSLT (mam kilka 3,000 + przekształceń liniowych, które utrzymuję) to martwy kod. Jestem pewien, że w moich transformacjach są szablony, które nigdy więcej nie zostaną użyte, ponieważ warunki, dla których testują, nigdy więcej się nie pojawią. Nie ma sposobu, aby określić programowo, czy coś takiego jak <xsl:template match="SomeField[contains(., "some value")]> jest żywe lub martwe, ponieważ zależy to od czegoś, czego metadane nie mogą ci powiedzieć.

 4
Author: Robert Rossney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-15 20:00:42

I. elegancki kod XSLT


często można znaleźć przykłady pięknego kodu XSLT, zwłaszcza gdy XSLT jest używany jako funkcjonalny język programowania .

Przykłady zobacz Ten artykuł on FXSL 2.0 -- Biblioteka programowania funkcyjnego dla XSLT 2.0.

Jako język FP XSLT jest również język deklaratywny. Oznacza to między innymi, że deklaruje się, określa istniejące relacje.

Taka definicja często nie wymaga żadnego dodatkowego kodu, aby uzyskać wynik-sama w sobie jest własną implementacją lub wykonywalną definicją lub wykonywalną specyfikacją.

Oto mały przykład .

To wyrażenie XPath 2.0 definiuje "Maximum Prime Factor liczby naturalnej":

if(f:isPrime($pNum))
  then $pNum
  else
    for $vEnd in xs:integer(floor(f:sqrt($pNum, 0.1E0))),
        $vDiv1 in (2 to $vEnd)[$pNum mod . = 0][1],
        $vDiv2 in $pNum idiv $vDiv1
      return
        max((f:maxPrimeFactor($vDiv1),f:maxPrimeFactor($vDiv2)))

Wymowa w języku angielskim , Maksymalna liczba pierwsza numer pNum jest liczbą samą w sobie, jeśli pNum jest pierwszym, w przeciwnym razie, jeśli vDiv1 oraz vDiv2 są dwa czynniki pNum, wówczas maksymalny współczynnik pierwszości pNum jest większy z maksimum czynników pierwszych vDiv1 oraz vDiv2.

Jak to wykorzystać do obliczenia maksymalnego współczynnika początkowego w XSLT? po prostu zamykamy powyższą definicję w <xsl:function> i ... get the wynik!

 <xsl:function name="f:maxPrimeFactor" as="xs:integer">
  <xsl:param name="pNum" as="xs:integer"/>

  <xsl:sequence select=
   "if(f:isPrime($pNum))
      then $pNum
      else
        for $vEnd in xs:integer(floor(f:sqrt($pNum, 0.1E0))),
            $vDiv1 in (2 to $vEnd)[$pNum mod . = 0][1],
            $vDiv2 in $pNum idiv $vDiv1
          return
            max((f:maxPrimeFactor($vDiv1),f:maxPrimeFactor($vDiv2)))
   "/>
 </xsl:function>

Możemy zatem obliczyć MPF dla dowolnej liczby naturalnej, na przykład:

f:maxPrimeFactor(600851475143) = 6857

Jeśli chodzi o wydajność, cóż, ta transformacja trwa tylko 0,109 sek .

Inne przykłady zarówno ellegant jak i efficient kodu XSLT :

II. niektóre Zasady


Oto kilka zasad pisania "quality XSLT code", zaczerpniętych z bloga Mukul Ghandi.

Można je sprawdzić/egzekwować za pomocą narzędzia opracowanego przez Mukul:

  1. DontUseDoubleSlashOperatorNearRoot: Unikaj używania operatora / / w pobliżu korzenia dużego drzewa.

  2. DontUseDoubleSlashOperator: Unikaj używania operatora / / w XPath wyrażenia.

  3. Settingvalueofvariableincorrely: przypisz wartość do zmiennej używając składni 'select', jeśli przypisujesz wartość łańcuchową.

  4. EmptyContentInInstructions: nie używaj pustej zawartości do instrukcji takich jak 'xsl: for-each' 'xsl: if' 'xsl: when' itd.

  5. DontUseNodeSetExtension: nie używaj funkcji rozszerzenia zestawu węzłów, jeśli używasz XSLT 2.0.

  6. RedundantNamespaceDeclarations: istnieją nadmiarowe przestrzenie nazw deklaracje w elemencie xsl: stylesheet.

  7. UnusedFunction: funkcje arkusza stylów są nieużywane.

  8. UnusedNamedTemplate: nazwane szablony w arkuszu stylów są nieużywane.

  9. UnusedVariable: zmienna jest nieużywana w arkuszu stylów.

  10. Unusedfunctiontemplateparametr: parametr funkcji lub szablonu jest nieużywany w treści funkcji/szablonu.

  11. TooManySmallTemplates: zbyt wiele niskich szablonów w arkusz stylów (10 lub więcej).

  12. MonolithicDesign: użycie pojedynczego szablonu / funkcji w arkuszu stylów. Możesz modularyzować kod.

  13. OutputMethodXml: Użycie metody wyjściowej ' xml ' podczas generowania kodu HTML.

  14. NotUsingSchemaTypes: arkusz stylów nie używa żadnego z wbudowanych typów schematów (xs: string itd.), podczas pracy w trybie XSLT 2.0.

  15. UsingNameOrLocalNameFunction: Using name () function when local-name() może być odpowiednie (i vice-versa).

  16. Functemplatecomplexity: rozmiar / złożoność funkcji lub szablonu jest wysoka. Istnieje potrzeba refaktoryzacji kodu.

  17. NullOutputFromStylesheet: arkusz stylów nie generuje żadnych użytecznych danych wyjściowych. Proszę ponownie zapoznać się z logiką arkusza stylów.

  18. UsingNamespaceAxis: używanie przestarzałej osi przestrzeni nazw podczas pracy w XSLT 2.0 mode.

  19. CanUseAbbreviatedAxisSpecifier: używanie długich specyfikacji osi, takich jak child::, attribute:: lub parent:: node().

  20. UsingDisableOutputEscaping: ustawiono atrybut disable-output-escaping na 'yes'. Proszę ponownie zapoznać się z logiką arkusza stylów.

  21. Notcreatingelementcorrecily: Tworzenie węzła elementu za pomocą instrukcji xsl: element, gdy było to możliwe bezpośrednio.

  22. AreYouConfusingVariableAndNode: możesz pomylić odniesienie do zmiennej z odniesieniem do węzła. (autor: Alain Benedetti)

  23. Incorrerectuseofbooleanconstants: niepoprawne użycie stałych logicznych jako 'true' lub 'false'. (autor: Tony Lavinio)

  24. ShortNames: użycie nazwy jednego znaku dla zmiennej / funkcji / szablonu. Używaj sensownych nazw dla tych funkcje.

  25. NameStartsWithNumeric: nazwa zmiennej / funkcji / szablonu zaczyna się znakiem liczbowym

 9
Author: Dimitre Novatchev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:09:11

Najlepsze praktyki 1 : używaj szablonów zamiast Kiedy tylko możesz (co stanowi 99% przypadków)

(Czy Mogę dodać konserwację jako dodatkowy składnik w najlepszych praktykach, imho nawet najważniejszy)

Aby zrozumieć xsl naprawdę potrzebujesz trochę praktyki.
Nie rozumiejąc, co sth. robi to jest bardzo względne oczywiście.

To jest podwójne dla XSLT, ponieważ xsl: for-każdy konstrukt ma tendencję do

  • więcej czytelne

Dla nowicjusza, ale w rzeczywistości

  • mniej zorganizowany,
  • mniej proste,
  • mniej zwięzłe i
  • a lot less maintainable

Niż szablony i tylko

  • równomiernie czytelny (w najlepszym wypadku!!) za tak. z minimalnym doświadczeniem w template.

Nigdy, przenigdy nie używaj elementu !

Przyznam, że tytuł jest nieco przesadzone, istnieją, byłem powiedziane, przypadki w które " xsl dla każdego" może mieć swoje zalety, ale te przypadki są bardzo, bardzo rzadkie.

Kiedyś musiałem wymyślić dość skomplikowana strona klienta xml/xslt w mniej niż tydzień, i użył for-każdy element w całym miejscu. Teraz, kilka lat później i tak jakby, mądrzejszy, nie spieszyłem się i przepisałem kod początkowy, wykorzystujący tylko szablony. Kod teraz jest o wiele czystszy i bardziej elastyczny.

Albo ty to wiesz, albo ty powinno: and są prawie zawsze brawo. Jeśli jesteś xsl-ing, a Ty nie do końca rozumiem te tagi, przerwij swoją pracę teraz, naucz się ich, zdobądź aha-erlebnis, i kontynuuj swoją pracę a jako odrodzony (wo)człowiek.

 8
Author: Peter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-12 01:02:05

Problemy z plikami

1. Wiele małych plików jest lepszych niż kilka dużych.

Podziel się Hamburgerem.xsl do I-bread.xsl i i-beef.xsl.

2. Prefiks zawierał / importował pliki z 'i -'.

Służy jako wskaźnik, że plik powinien być edytowany z ostrożnością, ponieważ można złamać funkcjonalność importowania / włączania plików. Sprawdź je przed zatwierdzeniem zmian.

3. Nigdy nie dołączaj/Importuj nieprzygotowanego pliku.

Jeśli chcesz zrób cheeseburgera.xsl, nie włączaj hamburgera.xsl. Zamiast tego Dołącz i-bread.xsl, i-beef.xsl i nowo powstały i-cheese.xsl.

 4
Author: Azat Razetdinov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-12 06:05:10

Ze względu na czytelność używam znacznika xsl:template. Jest bardzo zwięzły i prosty w użyciu. Łatwo jest przekazać parametry do szablonu. Technika ta nazywana jest enkapsulacją i jest jednym z fundamentów dobrego programowania.

 1
Author: harley.333,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-12 01:08:34