5

みんな助けてください。単純な結果ツリーのフラグメントを宣言して、それを反復しようとしています。


...

<xsl:variable name="rtf">
  <item-list>
    <item id="1">one</item>
    <item id="2">two</item>
    <item id="3">three</item>
    <item id="4">four</item>
  </item-list>
</xsl:variable>

<xsl:for-each select="msxsl:node-set($rtf)/item-list/item">
  <xsl:value-of select="@id"/>
</xsl:for-each>

...


これがどのように機能するかについて私は完全に間違っていますか?


編集: 私は.NET XslCompiledTransformを使用しており、正しいmsxsl名前空間宣言を持っています - xmlns:msxsl="urn:schemas-microsoft-com:xslt"

変換は正常に実行されます - 問題は何も出力されないことです

4

3 に答える 3

8

私の疑いは、スタイルシートで宣言されたデフォルトの名前空間があることです。これにより、 <item-list> 要素と <item> 要素が効果的に名前空間に配置されます。XPath 1.0 を使用して名前空間で修飾された要素を選択するには、式で常にプレフィックスを使用する必要があります。

したがって、スタイルシートの上部に次のようなものがある場合:

<xsl:stylesheet xmlns="http://example.com"...>

次に、これも追加する必要があります。

<xsl:stylesheet xmlns="http://example.com" xmlns:x="http://example.com"...>

次に、XPath 式で「x」プレフィックスを使用します。

<xsl:for-each select="msxsl:node-set($rtf)/x:item-list/x:item">
  <xsl:value-of select="@id"/>
</xsl:for-each>

それがうまくいったかどうか教えてください。私はここで推測しているだけです。

于 2009-12-07T21:07:13.773 に答える
4

MSXSL とは異なり、本来あるべき場所で機能をXslCompiledTransform提供します- EXSLT 共通名前空間:node-set()

<xsl:stylesheet xmlns:exslt="http://exslt.org/common">
  ...
  <xsl:for-each select="exslt:node-set($rtf)/item-list/item">
  ...
</xsl:stylesheet>
于 2009-12-07T21:20:35.127 に答える
1

これは私には問題ないように見えます。

ただし、拡張機能の msxsl 名前空間を正しく宣言しましたか? このようなもの:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">

ここでは Microsoft XSLT プロセッサを使用していると想定しています

于 2009-12-07T13:12:36.390 に答える