1

I have a sql stored procedure which returns the xml data.the select command of my SP is

SELECT TXT1 
FROM @tmp1 CT
    LEFT JOIN ETEXT TT ON CT.Cate = TT.REFKEY FOR XML AUTO 

it returns the xml like

<root>
<item>
<XML_F52E2B61-18A1-11d1-B105-00805F49916B>
<TT TXT1="Mouse"/>
<TT TXT1="Computer"/>
</XML_F52E2B61-18A1-11d1-B105-00805F49916B>
</item>
</root>

I need to style this xml using xslt and print the TXT1 values, from last TXT1 value to First order.I tried some code but it is not possible to get my answer .my code like

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

Anybody help to get my answer?

4

1 回答 1

2

目前尚不清楚您要完成什么-也就是说,如果我们接受您上面的评论:

是的,我需要从 xml 中从最后一个到第一个选择所有 TXT1 值,这意味着最后一个值 Computer print first 和 Mouse Print next 像这样

...那么这个 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属性的值,然后是换行符。
于 2013-05-29T14:18:55.650 回答