哪个是用于执行流、调用模板或模式的更好实践?
数据文件
<Properties>
<foo>me</foo>
<bar>you</bar>
</Properties>
一个.xsl
<xsl:include href="translations_nomodes.xml"
<xsl:template match="/">
<xsl:call-template name="a_display"/>
</xsl:template>
b.xsl
<xsl:include href="translations_nomodes.xml"
<xsl:template match="/">
<xsl:call-template name="b_display"/>
</xsl:template>
翻译_nomodes.xsl
<xsl:template name="a_display">
<!-- display option a -->
...
</xsl:template>
<xsl:template name="b_display">
<!-- display option b -->
...
</xsl:template>
或者使用模式是更好的做法
.xsl
<xsl:include href="translations_modes.xml"
<xsl:template match="/">
<xsl:apply-templates select="/Properties" mode="c_display"/>
</xsl:template>
d.xsl
<xsl:include href="translations_modes.xml"
<xsl:template match="/">
<xsl:apply-templates select="/Properties" mode="d_display"/>
</xsl:template>
翻译模式.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>
由于“属性”是我文档中的根节点,并且应用模板使用文字作为其模式值,因此使用模式不会给我任何额外的好处,而且它会稍微冗长一些。但是,如果执行流依赖于文档本身中的元素/属性,并且模式不是文字而是表达式,那么我可以看到需要模式方法。
事实上,像我一样使用带有字面值的模式似乎是一个糟糕的选择,因为如果以后我的逻辑发生变化并且我需要使用模式表达式来控制执行流程,我已经“使用”了模式属性。
我得出了正确的结论还是我遗漏了一些重要的观点?
最佳答案
回答这个问题有点晚了。 apply-templates 和 call-template 之间的一大区别是,在后一种情况下,被调用的模板继承了调用者的当前节点(有时称为上下文节点)。而使用 apply-template 时, select="expr"通过生成节点列表然后迭代它们来确定上下文模式。
使用您的示例,a.xsl 和 b.xsl 都匹配“/”。当它们在 translations_nomodes.xsl 中调用-template a_display 和 b_display 时,这些模板继承“/”作为上下文节点。
相比之下,c.xsl 和 d.xsl 中的模板应用带有 select="/Properties"的模板。由于只有一个“/Properties”,它是列表中唯一要迭代的节点,它成为 XSLT 处理器寻找最佳匹配的上下文节点。因此,translations_modes.xsl 中的模板将看到“/Properties”作为上下文节点。
那么哪种做法更好呢?取决于您是要继续处理当前上下文节点还是选择其他节点重新开始处理。
希望有帮助。
关于xml - XSLT:执行流程的调用模板与模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3737750/