web-dev-qa-db-ja.com

ノードセットを作成し、パラメーターとして渡す

XSLT 1.0を使用して、基本的に小さなノードセットを作成し、それを次のようなパラメーターとしてテンプレートに渡そうとしています。

<xsl:call-template name="widget">
  <xsl:with-param name="flags">
    <items>
      <item>widget.recent-posts.trim-length=100</item>
      <item>widget.recent-posts.how-many=3</item>
      <item>widget.recent-posts.show-excerpt</item>
    </items>
  </xsl:with-param>
</xsl:call-template>

アイデアは、widgetテンプレート内から次のようなものを書くことができるということです。

<xsl:value-of select="$flags/item[1]" />

明らかに、コンパイルエラーが発生します。どうすればこの種のことを実現できますか?

28

XSLT 1.0には一時ツリーを動的に作成する方法(非標準)がありますおよびそれらのXPath式を評価しますただし、これにはxxx:node-set()関数を使用する必要があります =。

_xsl:variable_または_xsl:param_の本体内にノードが動的に作成される場合は常に、その_xsl:variable_/_xsl:param_のタイプはRTF(結果ツリーフラグメント)およびW3 XSLT 1.0仕様。 RTFに対して評価できるXPath式の種類を厳しく制限します。

回避策として、ほとんどすべてのXSLT 1.0ベンダーには独自のxxx:node-set()拡張機能関数があり、RTFを受け取り、そこから通常のノードセットを生成します。

xxxプレフィックス(または選択した他のプレフィックス)がバインドされている名前空間は、ベンダーによって異なります。 MSXMLと2つの.NET XSLTプロセッサの場合は、_"urn:schemas-Microsoft-com:xslt"_です。 EXSLTライブラリは名前空間を使用します:_"http://exslt.org/common"_。この名前空間EXSLTは多くのXSLT 1.0プロセッサに実装されており、可能であればxxx:node-set()拡張を使用することをお勧めします。

簡単な例を示します

_<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxsl="urn:schemas-Microsoft-com:xslt"
 xmlns:ext="http://exslt.org/common"
  exclude-result-prefixes="ext msxsl"
 >
 <xsl:template match="/">
  <xsl:variable name="vTempRTF">
   <a>
    <b/>
   </a>
  </xsl:variable>

  <xsl:copy-of select="ext:node-set($vTempRTF)/a/*"/>
 </xsl:template>
</xsl:stylesheet>
_
29

さて、私はこれを次の方法でうまく回避することができました:

最初に、カスタム名前空間をスタイルシートに追加します。 xmlns:myns="http://my.ns.com"

次に、スタイルシートの上部でノードセットを定義します。

<myns:recent-posts-flags>
    <item>widget.recent-posts.trim-length=100</item>
    <item>widget.recent-posts.how-many=3</item>
    <item>widget.recent-posts.show-excerpt</item>
</myns:recent-posts-flags>

次に、次の方法で参照します。

<xsl:call-template name="widget">
    <xsl:with-param name="flags" select="document('')/*/myns:recent-posts-flags" />
</xsl:call-template>

これは機能しますが、最初の例のように、<xsl:with-param>タグ自体の中にノードセットを定義することは、やはり理想的です。誰でも可能だと思いますか?

6