0

ストアドプロシージャを介してDBからデータを取得しており、FORXMLAUTOを使用してこのデータを取得しています。クエリはこんな感じ

WHERE ITEMNUMBER=@itemid AND DATASET = @dataset FOR XML AUTO, ELEMENTS) AS filters

結果のxmlは

    <filters extra="filters">
    <ISP_WebItem>
      <FILTER>Type</FILTER>
      <FILTERNAME>Matematik</FILTERNAME>
      <UNITCODE></UNITCODE>
    </ISP_WebItem>
    <ISP_WebItem>
      <FILTER>Strømkilde</FILTER>
      <FILTERNAME>Solceller</FILTERNAME>
      <UNITCODE></UNITCODE>
    </ISP_WebItem>
  </filters>

今私の問題は、xsltでこの結果をループしようとすると、結果を取得できないことです。私のXSLTコードはこのようなものです

  <xsl:variable name="filt" select="msxsl:node-set(filters)"/>   
<xsl:for-each select="$filt/ISP_WebItem">   
  <xsl:copy-of select="FILTER"/>
</xsl:for-each>

'filt'変数でfilterxmlを正しく取得していますが、foreachループが正しく実行されません。コードにブレークポイントを設定しようとすると、コードの実行がループ内に入らないことに気付きました。つまり、

 <xsl:for-each select="filt/ISP_WebItem">   

このコードは決して満足しません。また、追加情報として、このフィルターノードは大きなXMLデータの一部であり、このデータ内の他のすべてのノードは正しく機能しています(つまり、ループしたり、それらを使用して任意の操作を実行したりできます)。誰もが考えられる理由を提案できますか。

4

1 に答える 1

2

XSLT には 2 つの問題があります。まず、filtは変数なので、これを示す $ を前に付ける必要があります。そうしないと、XSLT はfiltという名前の要素を探します。

<xsl:for-each select="$filt/ISP_WebItem">   

次に、XML サンプルではFILTERは要素ですが、xsl:copy-ofステートメントは「FILTER」という名前の属性を探しています。あなたはこれをしているはずです

<xsl:copy-of select="FILTER"/>

ただし、属性の場合はそのままにしておきます<xsl:copy-of select="@FILTER"/>

たとえば、この XSLT は機能します。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" extension-element-prefixes="msxsl">
   <xsl:output method="xml" indent="yes"/>
   <xsl:template match="/">
      <xsl:variable name="filt" select="msxsl:node-set(filters)"/>
      <xsl:for-each select="$filt/ISP_WebItem">
         <xsl:copy-of select="FILTER"/>
      </xsl:for-each>
   </xsl:template>
</xsl:stylesheet>

実際、要素だけをコピーしたい場合は、xsl:for-eachを削除して、次のように単純化できます。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" extension-element-prefixes="msxsl">
   <xsl:output method="xml" indent="yes"/>
   <xsl:template match="/">
      <xsl:variable name="filt" select="filters"/>
      <xsl:copy-of select="$filt/ISP_WebItem/FILTER"/>
   </xsl:template>
</xsl:stylesheet>

ただし、このインスタンスでnode-setを使用する必要があるかどうかはよくわかりません (ただし、要約されたコード サンプルを示しているだけなので、別の場所で必要になる可能性があります)。

以下も機能します

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" extension-element-prefixes="msxsl">
   <xsl:output method="xml" indent="yes"/>
   <xsl:template match="/">
      <xsl:for-each select="filters/ISP_WebItem">
         <xsl:copy-of select="FILTER"/>
      </xsl:for-each>
   </xsl:template>
</xsl:stylesheet>

編集:それでも問題が発生する場合は、代わりに次の式のいずれかを試してください。

<xsl:for-each select="$filt//ISP_WebItem">
于 2012-12-31T07:37:56.117 に答える