我有一个返回xml数据的sql存储过程。我的SP的select命令是
SELECT TXT1
FROM @tmp1 CT
LEFT JOIN ETEXT TT ON CT.Cate = TT.REFKEY FOR XML AUTO
它返回像
这样的XML<root>
<item>
<XML_F52E2B61-18A1-11d1-B105-00805F49916B>
<TT TXT1="Mouse"/>
<TT TXT1="Computer"/>
</XML_F52E2B61-18A1-11d1-B105-00805F49916B>
</item>
</root>
我需要使用xslt样式化这个xml并打印TXT1值,从最后的TXT1值到第一顺序。我尝试了一些代码,但它是不可能得到我的答案。我的代码像
<xsl:variable name="cate" select="shop:ExecStoredProcedure('kt_cate',concat('@Dcat:',$default))">
<xsl:variable name="txt1-atts" select="$cate//TT/@TXT1"/>
有人能帮我得到答案吗?
你想要达到的目标不是特别明确——也就是说,如果我们采纳你上面的评论:
是的,我需要从xml从最后到第一选择所有的TXT1值表示最后值计算机先打印,鼠标再打印,像这样
…那么这个XSLT 1.0解决方案就实现了您想要的。
当这个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>
…
<root>
<item>
<XML_F52E2B61-18A1-11d1-B105-00805F49916B>
<TT TXT1="Mouse"/>
<TT TXT1="Computer"/>
</XML_F52E2B61-18A1-11d1-B105-00805F49916B>
</item>
</root>
…生成所需的结果:
Computer
Mouse
解释:
XSLT由两个模板组成:
- 第一个模板匹配文档中的第一个元素,一旦找到它,就指示XSLT处理器将模板应用于具有
@TXT1
属性的所有重子<TT>
元素。最重要的是,指示处理器以倒序(通过<xsl:sort>
指令)将模板应用于这些元素。 - 第二个模板匹配所有
<TT>
元素(鉴于前一个模板单独存在,这意味着它将匹配所有具有@TXT1
属性的<TT>
元素)。一旦找到这样一个元素,就打印其@TXT1
属性的值,后跟一个换行符。