2012-06-13 7 views
5

Czy dopuszczalne jest, aby zadzwonić do tego samego dokumentu w całej XSLT akt tak:wydajność podczas korzystania z dokumentu() wielokrotnie w XSLT

<xsl:value-of select="document('doc.xml')/root/bar/foo1" /> 
<xsl:value-of select="document('doc.xml')/root/bar/foo2" /> 
<xsl:value-of select="document('doc.xml')/root/bar/foo3" /> 

...?

Mogę sobie wyobrazić, że buforowanie pozwala uniknąć narzutu na to, aby czytać plik za każdym razem.

Czy powinienem zapisać plik doc.xm w zmiennej i użyć tej zmiennej do zapytania?

W tym przypadku będę musiał użyć jakiejś biblioteki takiej jak Xsle, ponieważ używam xslt1.

Czy jest jakieś inne rozwiązanie?

Uwaga: Niektóre części XPath powinna być dynamiczna jak:

<xsl:value-of select="document('doc.xml')/root/*[name()=$lang]/foo3" /> 
+0

Aby nie mieć żadnych wątpliwości, zawsze możesz * zmierzyć * wydajność - w tym konkretnym przypadku pomiary powinny potwierdzić odpowiedź Michaela Kaya. Ogólnie rzecz biorąc, mierzenie wydajności jest zalecaną metodą odpowiedzi na takie pytania, a nie wiarą w kogokolwiek. –

+0

Dimitre, ofcoure, zobacz moją uwagę na odpowiedź Woody'ego. – Peter

Odpowiedz

2

Procesory XSLT są wymagane, aby zapewnić, że jeśli dwa razy wywołasz document() z tym samym adresem URL, zwrócone węzły są identyczne w takim znaczeniu, w jakim liczą się (dokument ("a.xml") | dokument ("a'xml")) = 1. Trudno spełnić to wymaganie bez buforowania dokumentu, więc myślę, że możesz być dość pewny, że każdy dokument zostanie pobrany i przeanalizowany tylko raz. Jednak umieszczenie go w zmiennej globalnej nigdy nie zaszkodzi.

+0

na pewno, więc jestem teraz :-) Dzięki! – Peter

1

Osobiście gdy użyłem go zawsze umieścić ją w zmiennej dla wygody, czy dostał wartości mi potrzebne, żeby zrobić łatwiej czytać. Dzięki MSXSL, którego ostatnio używałem, mogłem umieścić go w drzewie węzłów i uzyskać do niego dostęp w ten sposób.

Nie mogę sobie wyobrazić, że procesor XSL nie buforuje tego samego pliku w jakiś sposób, ale podejrzewam, że jest inny dla wszystkich procesorów i nie wydaje się być zapisany.

Gdybym chciał wiedzieć z procesorem, z którego korzystałem, po prostu skopiowałbym i przeszedłem na duży dokument i przetestowałem go jako test, nie trzeba było długo czekać i jest to jedyny sposób, aby się upewnić w twoim systemie.

+0

Prawdą jest, że często nie ma alternatywy do testowania ... Ale ten sam plik xslt może być hostowany na różnych platformach, dlatego też zalecane są wytyczne lub "zachowania według projektu" – Peter

+0

Zgadzam się. Cóż, używając MSXSL4, nigdy zauważyłem różnicę wydajności w dowolny sposób, więc mogę tylko założyć, że było buforowanie (używałem dużych plików). Nie ma wymogu w specyfikacji, ale trudno byłoby sobie wyobrazić, że to nie jest robione – Woody

Powiązane problemy