Sql 使用xslt从xml获取值

Sql 使用xslt从xml获取值,sql,xml,xslt,xslt-1.0,Sql,Xml,Xslt,Xslt 1.0,我有一个返回xml数据的sql存储过程 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数据的sql存储过程

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, '&#10;')"/>
  </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
说明:

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

不清楚您在这里要求什么。你是指位置函数吗?@TonyHopkinson是的,我需要从xml中选择所有TXT1值,从最后到第一表示最后一个值计算机先打印,鼠标先打印,然后像这样请始终提供您希望接收的输出。我在下面给了你一个答案,但是没有看到确切的XML输出,我只能猜测了。看起来@ABach的想法和我一样,我对他的回答没有异议。