1

この質問で見つかった答えに似たものを使用して、変数にロードしたXML結果ツリーフラグメントを作成するために基づいた関数をまとめました。

このXMLを変換できました

  <Summary> &lt;Summary&gt;&#xD;
        &lt;Category&gt;&#xD;
            &lt;Category&gt;Tuition and Fees&lt;/Category&gt;&#xD;
            &lt;TotalDebits&gt;0.00&lt;/TotalDebits&gt;&#xD;
            &lt;TotalCredits&gt;-3509.45&lt;/TotalCredits&gt;&#xD;
        &lt;/Category&gt;&#xD;
        &lt;Category&gt;&#xD;
            &lt;Category&gt;Miscellaneous&lt;/Category&gt;&#xD;
            &lt;TotalDebits&gt;60.62&lt;/TotalDebits&gt;&#xD;
            &lt;TotalCredits&gt;-234.36&lt;/TotalCredits&gt;&#xD;
        &lt;/Category&gt;&#xD;
    &lt;/Summary&gt;&#xD;
  </Summary>

これに

<Summary>
    <Category>
        <Category>Tuition and Fees</Category>
        <TotalDebits>0.00</TotalDebits>
        <TotalCredits>-3509.45</TotalCredits>
    </Category>
    <Category>
        <Category>Miscellaneous</Category>
        <TotalDebits>60.62</TotalDebits>
        <TotalCredits>-234.36</TotalCredits>
    </Category>
</Summary>

この変数に含まれている

  <xsl:variable name="SummaryItems">
    <xsl:call-template name="TheGreatUnescape">
      <xsl:with-param name="escaped" select="string(//Summary)" />
    </xsl:call-template>
  </xsl:variable>

今私の問題は、exslt:node-set()この変数内のノードへのアクセスを取得するために使用しようとしていますが、情報を取得していないことです。

次のような機能を使用する場合

<xsl:for-each select="exslt:node-set($SummaryItems)/Summary/Category">

結果は出ません。

xmlns:exslt="http://exslt.org/common"に宣言を含め、関数xsl:stylesheetをテストしたnode-setので、変数内の変換されたXMLでは機能しないことがわかりました。

exslt:node-setアクセスできるコードを使用して、実際の結果ツリーフラグメントを作成しましたか?

4

2 に答える 2

4

一致しないものの最も一般的な理由は、それらが期待する名前空間にないことです。完全なコードを示していないが段階的に機能しているため、言うのは難しいです。

あなたは言う

<xsl:copy-of select="exslt:node-set($SummaryItems)"/>

動作するので、試してみてください

<xsl:copy-of select="exslt:node-set($SummaryItems)/*"/>

それがうまくいくなら、試してみてください

<xsl:copy-of select="exslt:node-set($SummaryItems)/Summary"/>

それが機能しない場合は、100回のうち99回で名前空間の問題であるものをSummary選択していません。<Summary>


元の回答(問題が修正されました)

<xsl:for-each select="exslt:node-set($SummaryItems)\Summary\Category">

XPath構文エラーが間違ったパス区切り文字になるはずです

<xsl:for-each select="exslt:node-set($SummaryItems)/Summary/Category">
于 2013-01-18T21:17:33.670 に答える
2

デビッド・カーライルは、名前空間の問題がおそらく期待どおりに一致しない最も一般的な原因であるというのは正しいです。

ノード セットに関する問題の 2 つ目の一般的な原因 (少なくとも、私には定期的に発生します) は、ノード セットにバインドされた変数名によってどのノードが示されるかについての一時的な混乱です。詳細はバインディングがどのように行われるかによって異なりますが、あなたの言うことから、 2つの要素を含む要素(など)$SummaryItemsにバインドされている可能性が高いようです-その場合、要素が含まれていないため、式は結果を生成しません. 必要な要素はのノードの子ではありません。それらのノードです。SummaryCategoryexslt:node-set($SummaryItems)/Summary/Category$SummaryItemsSummarySummary$SummaryItems$SummaryItems

この場合、試してみexslt:node-set($SummaryItems)/Categoryます。

より一般的なケースでは、このような問題が発生した場合、テスト コードを実行して自分がどこにいるのかを調べますname(exslt:node-set($SummaryItems)[1])。たとえば、何が返されるのでしょうか?

于 2013-01-19T02:59:16.530 に答える