/ / Pobieranie wartości z xml przy użyciu xslt - sql, xml, xslt, xslt-1.0

Pobieranie wartości z xml przy użyciu xslt - sql, xml, xslt, xslt-1.0

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 № 1

Nie 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, "&#10;")"/>
</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.