1

私は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"/>

誰かが私の答えを得るのを手伝ってくれますか?

4

1 に答える 1

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 は 2 つのテンプレートで構成されています。

  • 最初のテンプレートはドキュメント内の最初の要素と一致し、それが見つかると、属性を持つすべてのひ孫<TT>要素にテンプレートを適用するよう XSLT プロセッサに指示します。@TXT1最も重要なことは、プロセッサがテンプレートをこれらの要素に逆の順序で適用するように(命令を介して<xsl:sort>) 指示されていることです。
  • 2 番目のテンプレートは、すべての要素に一致し<TT>ます (前のテンプレートが単独で存在することを考えると<TT>、属性を持つすべての要素に一致することを意味し@TXT1ます)。そのような要素が 1 つ見つかると、その@TXT1属性の値が出力され、その後に改行が続きます。
于 2013-05-29T14:18:55.650 に答える