apply-templates到当前模板节点,而不是上下文节点?

时间:2013-08-29 23:03:38

标签: xslt

我是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>

这似乎是不必要的重复,特别是考虑到这是一个开始,我相信它会变得更复杂。这不是一件不寻常的事情...我还应该使用其他方法吗?

P.S。 - 我使用的是依赖于libxslt的Symphony CMS,所以没有XSLT 2.0

1 个答案:

答案 0 :(得分: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指令,或者用户 - 定义的功能。