1

名前付きテンプレートのパラメーターを別のテンプレートの一致パターンとして指定することはできますか?

ここで、「抜粋」テンプレートを呼び出して、「パス」パラメータとしてXPathを渡そうとすると、エラーが発生します。

<xsl:template name="excerpt">
    <xsl:param name="path" select="''" />
    <xsl:apply-templates select="$path" />
</xsl:template>

<xsl:template match="$path">
    <article class="newsarticle">
        <h2><a href="{$root}/news/view/{title/@handle}"><xsl:value-of select="title" /></a></h2>
        <xsl:copy-of select="excerpt/node()" />
    </article>
</xsl:template>

私はそれを達成することができます<xsl:for-each>が、上記のアプローチと同様の何かを使用して良い解決策があるかどうか疑問に思いました。

編集:これが私が達成しようとしていることであり、<xsl:for-each>

<xsl:template name="excerpt">
    <xsl:param name="path" select="''" />
    <xsl:for-each select="$path">
        <article class="newsarticle">
            <h2><a href="{$root}/news/view/{title/@handle}"><xsl:value-of select="title" /></a></h2>
            <xsl:copy-of select="excerpt/node()" />
        </article>
    </xsl:for-each>
</xsl:template>

編集:テンプレートの呼び出し例:

<xsl:call-template name="excerpt">
    <xsl:with-param name="path" select="path/to/nodeset" />
</xsl:call-template>
4

2 に答える 2

1

追加情報をありがとう。ここで明確にすることの1つcall-templateは、パスではなくノードセットを渡しているということです。パスの文字列値は、複雑な解析ロジックや拡張関数がなければ、XSLT1.0ではほとんど価値がありません。

あなたがやろうとしていることを、あなたが想像していたこととは少し異なる方法で行う方法があります。matchこのように、一般的な値と値を持つテンプレートを使用する必要がありますmode

<xsl:template name="excerpt">
    <xsl:param name="items" select="''" />
    <xsl:apply-templates select="$items" mode="excerptItem" />
</xsl:template>

<xsl:template match="node() | @*" mode="excerptItem">
    <article class="newsarticle">
        <h2>
          <a href="{$root}/news/view/{title/@handle}">
             <xsl:value-of select="title" />
          </a>
        </h2>
        <xsl:copy-of select="excerpt/node()" />
    </article>
</xsl:template>

ただし、名前付きテンプレートが一致テンプレートを呼び出すためだけに機能している場合は、名前付きテンプレートはまったく必要ありません。一致テンプレートを直接使用できます。

<xsl:apply-templates select="path/to/nodeset" mode="excerptItem" />

modeこの属性の目的は、で指定modeすると、XSLTは同じ値apply-templatesを持つテンプレートのみを考慮することです。modeしたがって、同じ要素を異なる方法で処理する2つの異なるテンプレートを定義できます。

<xsl:template match="Item" mode="header">
     Item in header: <xsl:value-of select="." />
</xsl:template>
<xsl:template match="Item" mode="body">
     Item in body: <xsl:value-of select="." />
</xsl:template>

次に、異なる時間に使用するものを指定できます。

<div id="header">
    <xsl:apply-templates match="/root/Items/Item" mode="header" />
</div>
<div id="body">
    <xsl:apply-templates match="/root/Items/Item" mode="body" />
</div>

いずれの場合も適切なものが使用されます。モードについて詳しくは、こちらをご覧ください。

node() | @*は任意のノードまたは属性に一致する汎用XPathであるため、テンプレートのmatch属性で使用すると、で使用するほとんどすべてに一致するテンプレートを作成できますapply-templates(優先度の高い別のテンプレートがない限り) )。これをと組み合わせて使用mode​​すると、任意のノードで、必要な特定の時間にのみ呼び出すことができるテンプレートを作成できます。この例では、このテンプレートで使用する要素は常に同じであるように見えるため、明示的に指定することをお勧めします。

<xsl:template match="ExportItem" mode="excerptItem">
于 2013-01-19T18:00:35.863 に答える
0

名前付きテンプレートのパラメーターを取得して、別のテンプレートの一致パスとして機能させることはできますか?

いいえ、XSLT 2.0では、テンプレートの一致パターンには、id()関数への引数として変数参照のみを含めることができます。

パターンの完全な文法については、XSLT2.0W3Cの仕様を参照してください。

http://www.w3.org/TR/xslt20/#pattern-syntax

XSLT 1.0では、一致パターン内のどこかに変数参照があるとエラーになります

于 2013-01-19T18:04:49.370 に答える