gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 02:09:32 24 4
gpt4 key购买 nike

执行流程、调用模板或模式哪个更好?

数据.xml

<Properties>
<foo>me</foo>
<bar>you</bar>
</Properties>

a.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>

translations_nomodes.xsl

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

<xsl:template name="b_display">
<!-- display option b -->
...
</xsl:template>

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

c.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>

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

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

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

最佳答案

回答这个问题有点晚了。 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”视为上下文节点。

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

希望对您有所帮助。

关于xml - XSLT:执行流程的调用模板与模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3737750/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com