Mam procedurę składowaną SQL, która zwraca dane XML. Poleceniem select mojego SP jest
SELECT TXT1
FROM @tmp1 CT
LEFT JOIN ETEXT TT ON CT.Cate = TT.REFKEY FOR XML AUTO
zwraca xml jak
<root>
<item>
<XML_F52E2B61-18A1-11d1-B105-00805F49916B>
<TT TXT1="Mouse"/>
<TT TXT1="Computer"/>
</XML_F52E2B61-18A1-11d1-B105-00805F49916B>
</item>
</root>
Muszę nadać styl xml za pomocą xslt i wydrukować wartości TXT1, od ostatniej wartości TXT1 do pierwszego zamówienia. Próbowałem trochę kodu, ale nie jest możliwe uzyskanie mojej odpowiedzi. Mój kod jak
<xsl:variable name="cate" select="shop:ExecStoredProcedure("kt_cate",concat("@Dcat:",$default))">
<xsl:variable name="txt1-atts" select="$cate//TT/@TXT1"/>
Czy ktoś pomaga uzyskać moją odpowiedź?
Odpowiedzi:
2 dla odpowiedzi № 1Nie jest szczególnie jasne, co próbujesz osiągnąć - to powiedziawszy, jeśli weźmiemy twój komentarz powyżej:
Tak, muszę wybrać wszystkie wartości TXT1 z pliku XML od ostatniego do pierwszego oznacza Ostatnia wartość Wydrukuj komputer jako pierwszy i Drukuj myszą następny w ten sposób
... to rozwiązanie XSLT 1.0 osiąga to, czego chcesz.
Kiedy ten XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="yes" indent="yes" method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:apply-templates select="*/*/TT[@TXT1]">
<xsl:sort select="position()" order="descending"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="TT">
<xsl:value-of select="concat(@TXT1, " ")"/>
</xsl:template>
</xsl:stylesheet>
... jest stosowany względem dostarczonego XML:
<root>
<item>
<XML_F52E2B61-18A1-11d1-B105-00805F49916B>
<TT TXT1="Mouse"/>
<TT TXT1="Computer"/>
</XML_F52E2B61-18A1-11d1-B105-00805F49916B>
</item>
</root>
... pożądany wynik jest generowany:
Computer
Mouse
Wyjaśnienie:
XSLT składa się z dwóch szablonów:
- Pierwszy szablon pasuje do pierwszego elementu w dokumencie, a po znalezieniu instruuje procesor XSLT, aby zastosował szablony do wszystkich prawnuków
<TT>
elementy, które mają@TXT1
atrybut. Co najważniejsze, procesor otrzymuje polecenie zastosowania szablonów do tych elementów w odwrotnej kolejności (za pośrednictwem<xsl:sort>
instrukcja). - Drugi szablon pasuje do wszystkich
<TT>
elementy (co, biorąc pod uwagę samotne istnienie poprzedniego szablonu, oznacza, że będzie pasował do wszystkich<TT>
elementy, które mają@TXT1
atrybut). Po znalezieniu jednego takiego elementu jego wartość@TXT1
atrybut jest drukowany, po nim następuje nowa linia.