konto usunięte

Temat: problem z xslt

Może to nie jest najlepsza grupa ale chyba nie ma na GL za dużo o xslt.

Problem jest następujący:
<xsl:template name="foo">
<xsl:param name="bar" />
<xsl:for-each select="$bar">
...
</xsl:for-each>
</xsl:template>


To oczywiście nie zadziała bo $bar rozwija się do stringa a nie ścieżki. Pytanie jest jak to obejść? Jak podać wyliczoną jakoś ścieżkę jako select do for-each?
Google było mało pomocne, dużo takich pytań, mało odpowiedzi i 0 działających.
Dodam, że chodzi o transformację w IE, więc XSLT w wersji 1.

Temat: problem z xslt

Nie lepiej zrobić template z odpowiednim match? A wywoływać przez apply-templates dla elementów "bar"? Ewentualnie proste powiązania można rozwiązać podając selectowi "/*[name()=$bar]", ale to mało uniwersalne rozwiązanie. Odpowiedni match to w Twoim przypadku to czego szukasz.

konto usunięte

Temat: problem z xslt

W normalnym przypadku jak najbardziej, tylko mój problem jest wyjątkowy :)
Mam plik xml wielkości rzędu ~15-20MB ze strukturą dość nieregularną i "bar"ów różnych jest kilkaset i od czasu do czasu pojawiają się nowe. Ścieżki do "bar"ów też są różne i nie ma tu wyraźnej zasady, dlatego jest ona "dynamicznie" wyznaczana przez szablon.

Do tej pory używałem właśnie wspomnianego rozwiązania z matchem dla każdego bara, ale urosło to strasznie i zrobiło się niemiłosiernie wolne i trudne w utrzymaniu, dlatego chcę to zautomatyzować.

Temat: problem z xslt

Poza zaproponowanym rozwiązaniem nie znam innego ;-) Ale trochę nie rozumiem, co chcesz osiągnąć? Taki sam szablon zastosować dla różnych elementów? Prawdopodobnie masz bardzo skopanego xml'a i chyba żadne rozwiązanie Ci tu wiele nie ułatwi ;-) Jak byś mógł pokazać o co Ci chodzi dokładniej (z fragmentem XMLa i XSLT) to może byśmy coś wymyślili.

konto usunięte

Temat: problem z xslt

dzięki za zainteresowanie, mam coś takiego
<obiekt>
<grupa1>
<podgrupa1>
<element1 />
</podgrupa1>
</grupa1>
<grupa2>
<element2 />
</grupa2>
...
</obiekt>
<obiekt>
<grupa3>
<podgrupa3>
<podpodgrupa3>
<element3 />
...
czyli jak raczyłeś wspomnieć "skopanego xml'a", niestety nie do przeróbki :)
Chciałbym z tego osiągnąć takie coś:
<grupa1>
<podgrupa1>
<element1 ob1/>
<element1 ob2/>
<element1 ob3/>
...
</podgrupa1>
</grupa1>
<grupa2>
<element2 ob1/>
<element2 ob2/>
<element2 ob3/>
...

czyli w skrócie pozbierać elementy o takiej samej ścieżce z <obiekt'ów> i wrzucić je do jednego wora.
Tak jak wspomniałeś, można zrobić templaty np.
<xsl:template match="/obiekt/grupa">
<xsl:template match="/obiekt/grupa/podgrupa">
<xsl:template match="/obiekt/grupa/podgrupa/element">
, ale różnych match'ów jest dużo za dużo. Moim pomysłem było przejrzeć /obiekt[1]/, wyznaczyć z niego ścieżkę każdego noda i zaaplikować ją do wszystkich elementów o takiej samej ścieżce przez <xsl:call-template>.
Dodam jeszcze raz, ze rozmiary pliku xml są bardzo duże. Eksperymentalnie sprawdziłem np. że rozwiązanie z template'ami (zaproponowane i dotychczasowe) otwiera się ~40s, natomiast to moje (z wpisaną ścieżką na stałe, bo nie wiem jeszcze jak ją przekazywać) ~3s, więc jest o co walczyć ;)Krzysztof Kawa edytował(a) ten post dnia 28.02.10 o godzinie 13:19

konto usunięte

Temat: problem z xslt

Może zamiast walczyć z ograniczeniami xslt spróbuj generować sam plik xsl - część z templateami <xsl:template match="/obiekt/grupa"> lub <xsl:for-each select="$bar"> (to było szybsze?) na podstawie struktury pliku xml. Wymaga to dodatkowego nakładu na napisanie metody do analizy struktury pliku. Ograniczeniem może być częstotliwość zmian w pliku xml. W domowych warunkach ciężko sobie wyobrazić, analizę 20 MB pliku xml, generowanie na jego podstawie pliku xsl i transformację pliku xml do żądanej postaci kilka razy w ciągu minuty. O ile częstotliwość zmian w pliku xml nie jest zbyt duża lub możliwe jest operowanie na nie zawsze aktualnym pliku xsl (aktualizowanym np. raz na dobę/godzinę) możesz wziąć to pod uwagę. Nie jest to zbyt eleganckie rozwiązanie, ale powinno spełnić Twoje wymaganie odnośnie automatyzacji procesu.

Pozdrawiam,

Temat: problem z xslt

Brakuje mi czasu na napisanie kompletnego rozwiązania, ale stosując rekurencyjne wywoływanie szablonów, nazwy elementów (funkcja name() ) i osie ancestor:: descendant::, parent:: itp powinieneś dać radę. Iterowałbyś po wszystkich grupach, później wybierałbyś elementy, które mają jako rodzica tę grupę (ale tylko po jednym razie: http://www.biglist.com/lists/xsl-list/archives/200103/... i inne wątki dla hasła 'xslt distinct'), dla każdego z nich aplikowałbyś rekurencyjnie ten sam szablon.



Wyślij zaproszenie do