1

私は XSLT を初めて使用し、処理中のノードではなく、テンプレートで作成しているノードに正しい言葉遣いを使用しているかどうかわかりません。「現在のテンプレート ノード」とはa、このブロックのことを意味します。

<xsl:template match="item">
     <li>
         <a href="{location}">
             <xsl:value-of select="title" />
         </a>
     </li>
 </xsl:template>

に適用したい別のテンプレート マッチがありますa

<xsl:template match="a" mode="html">
    <a href="{@href}" title="this{@title}">
        <xsl:if test="number(substring(@href,1,4)='http')">
            <xsl:attribute name="class">external</xsl:attribute>
            <xsl:attribute name="target">_blank</xsl:attribute>
        </xsl:if>
        <xsl:value-of select="." />
    </a>
</xsl:template>

私の質問は次のとおりです。このaテンプレートをテンプレートでa作成しているに適用することは可能itemですか、それともコンテキストノードに対してのみこのように一致していますか? (また、将来の検索のために、この種のノードを何と呼びますか?)

読んでくれてありがとう。

編集:私のユースケースを求める@Jim Garrisonへの応答として、上記の例はそれほど遠くありません。含める必要がある唯一の追加情報は、作業中のノード セットです。次のようになります。

<related-links>
    <title>Link text</title>
    <location>http://link-address.whatever</location>
</related-links>

私が持っているaテンプレートは、HTMLとして処理しているノードに配置されたすべてのリンクに「外部」クラスを適用するために使用されます。related-linksこの特別なテンプレートに再利用したいと思います。現在私が考えられる唯一のことは、次のようなものです。

<xsl:template match="item">
     <li>
        <a href="{location}">
        <xsl:if test="number(substring(location,1,4)='http')">
            <xsl:attribute name="class">external</xsl:attribute>
            <xsl:attribute name="target">_blank</xsl:attribute>
        </xsl:if>
            <xsl:value-of select="title" />
        </a>
     </li>
 </xsl:template>

特にこれがまさに始まりであり、さらに複雑になると確信していることを考えると、これは不必要に繰り返されるように思えます。これは珍しいことではありません...私が使用すべき他のアプローチはありますか?

PS - libxslt に依存する Symphony CMS を使用しているため、XSLT 2.0 はありません

4

1 に答える 1

3

aこのテンプレートをテンプレートで作成している...に適用することはできitemますか?

拡張なしの XSLT 1.0 では、いいえ。マッチングは、入力ノードでのみ実行できます。

(かなり一般的な) node-set() 拡張子を持つ XSLT 1.0 では、はい:a要素またはその親li要素を変数に割り当て、その変数からノード セットを構築し、そのノード セット内のノードにテンプレートを適用します。

XSLT 2.0 では、はい:a要素またはその親li要素を変数に割り当て、その変数の値のノードにテンプレートを適用します。

「それは可能だ」と言うのは「それは良い考えだ」と言うのと同じではないことに注意してください. あなたが望むものを達成するための他のより簡単で直接的な方法があるかもしれません。特に、当面の目標が、リンクを生成するいくつかの場所のそれぞれでリンク関連のコードの重複を避けることである場合は、名前付きテンプレート (または XSLT 2.0 ではユーザー定義関数) を使用してそのコードを保持し、それを呼び出すことができます。テンプレート (または関数) を必要な場所から取り出します。XSLT に関する優れた本 (ほとんどの本格的な XSLT プログラマーは Michael Kay の本を頼りにしていますが、他にも優れた本があると思います) は、名前付きテンプレートと xsl:call-template 命令、または user-定義された関数。

于 2013-08-30T00:02:21.097 に答える