使用xslt从xml获取值

时间:2013-05-29 13:37:20

标签: sql xml xslt xslt-1.0

我有一个sql存储过程,它返回xml数据。我的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值到First order。我尝试了一些代码,但是无法得到我的答案。我的代码如

<xsl:variable name="cate" select="shop:ExecStoredProcedure('kt_cate',concat('@Dcat:',$default))">
    <xsl:variable name="txt1-atts" select="$cate//TT/@TXT1"/>

有人帮忙得到答案吗?

1 个答案:

答案 0 :(得分:2)

目前还不是特别清楚你想要完成什么 - 如果我们在上面发表你的评论那么说:

  

是的我需要从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, '&#10;')"/>
  </xsl:template>

</xsl:stylesheet>

...适用于提供的XML:

<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处理器将模板应用于具有<TT>属性的所有曾孙@TXT1个元素。最重要的是,系统会指示处理器以相反的顺序将这些元素应用于(通过<xsl:sort>指令)。
  • 第二个模板匹配所有<TT>元素(鉴于前一个模板的单独存在,这意味着它将匹配具有<TT>属性的所有@TXT1元素。找到一个这样的元素后,将打印其@TXT1属性的值,后跟换行符。