XSLT:执行流程的调用模板与模式

new*_*all 5 xml xslt

哪个是用于执行流、调用模板或模式的更好实践?

数据文件

<Properties>
    <foo>me</foo>
    <bar>you</bar>
</Properties>
Run Code Online (Sandbox Code Playgroud)

一个.xsl

<xsl:include href="translations_nomodes.xml"
<xsl:template match="/">
    <xsl:call-template name="a_display"/>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

b.xsl

<xsl:include href="translations_nomodes.xml"
<xsl:template match="/">
    <xsl:call-template name="b_display"/>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

翻译_nomodes.xsl

<xsl:template name="a_display">
    <!-- display option a -->
    ...
</xsl:template>

<xsl:template name="b_display">
    <!-- display option b -->
    ...
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

或者使用模式是更好的做法

.xsl

<xsl:include href="translations_modes.xml"
<xsl:template match="/">
    <xsl:apply-templates select="/Properties" mode="c_display"/>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

d.xsl

<xsl:include href="translations_modes.xml"
<xsl:template match="/">
    <xsl:apply-templates select="/Properties" mode="d_display"/>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

翻译模式.xsl

<xsl:template match="Properties" mode="c_display">
    <!-- display option c -->
    ...
</xsl:template>

<xsl:template match="Properties" mode="d_display">
    <!-- display option d -->
    ...
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

由于“属性”是我的文档中的根节点,并且应用模板使用文字作为其模式值,因此使用模式不会给我任何额外的好处,而且它会稍微冗长一些。但是,如果执行流依赖于文档本身中的元素/属性,并且模式不是文字而是表达式,那么我可以看到需要模式方法。

事实上,像我一样使用带有文字值的模式似乎是一个糟糕的选择,因为如果我的逻辑发生变化并且我需要使用模式表达式来控制执行流程,我已经“使用”了模式属性。

我得出了正确的结论还是我遗漏了一些重要的观点?

小智 3

回答这个问题有点晚了。apply-templates 和 call-template 之间的一个很大的区别是,在后一种情况下,被调用的模板继承调用者的当前节点(有时称为上下文节点)。而使用 apply-template 时, select="expr" 通过生成节点列表然后迭代它们来确定上下文模式。

使用您的示例,a.xsl 和 b.xsl 都匹配“/”。当它们在translations_nomodes.xsl 中调用模板a_display 和b_display 时,这些模板继承“/”作为上下文节点。

相反,c.xsl 和 d.xsl 中的模板应用带有 select="/Properties" 的模板。由于只有一个“/Properties”,因此它是列表中唯一要迭代的节点,并且它成为 XSLT 处理器寻找最佳匹配的上下文节点。因此,translations_modes.xsl 中的模板将把“/Properties”视为上下文节点。

那么哪种做法更好呢?取决于您是要继续处理当前上下文节点还是选择其他节点重新开始处理。

希望有帮助。