0

我正在使用 apply-templates 元素完成我的第一个 XSL 转换。开发 XSLT 时,最佳实践是什么?我应该非常具体地选择应用模板还是模板匹配或我没有考虑过的东西?

示例 A

<xsl:template match="/">
    <xsl:apply-templates select="A/B/C/D"/>
    <xsl:apply-templates select="J/K/L/M"/>
    <xsl:apply-templates select="W/X/Y/Z"/>
</xsl:template>

<xsl:template match="Q"/>

或者

示例 B

<xsl:template match="/">
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="A/B/C/D/Q or J/K/L/M/Q or W/X/Y/Z/Q"/>
4

2 回答 2

1

很难说哪个更好,因为这两个建议的片段做的事情非常不同,所以这取决于预期的结果是什么。

<xsl:template match="A/B/C/D/Q or J/K/L/M/Q or W/X/Y/Z/Q"/>

应该是语法错误

<xsl:template match="A/B/C/D/Q  | J/K/L/M/Q | W/X/Y/Z/Q"/>

或者可能更有效(但通常不等效)

<xsl:template match="Q"/>

因此,一旦错误得到修复,sampleB将首先深度遍历树,将默认模板应用于每个节点,特别是将所有文本复制到输出,直到它到达Q元素节点,在那里它将修剪遍历而不是复制Q或其后代到结果树。

完全相反的样本 A 根本不遍历树的深度优先文档顺序,并且首先处理A/B/C/D节点,特别是在此阶段它不处理AorB的任何其他子节点,C因此不会将这些子节点的任何文本节点后代复制到输出。然后它将从 D 开始深度优先遍历,Q像以前一样进行修剪。然后该过程再次开始,J/K/L/M"因此任何输出M都将在输出之后输出,D即使M在源中更早发生。这与B结果顺序反映输入顺序的样本形成对比。

这可能是最小示例的人工制品,但如果输入是格式良好的文档,则示例 A 中的三个应用模板中只有一个可以产生任何结果,因为/只能有一个元素子子元素,因此至少有两个A J W必须不选择任何内容。

于 2013-01-24T00:08:08.137 回答
0

一般来说,如果您想编写一个在源文档结构发生变化时仍然可以工作的样式表,最好将规则放在匹配模式中。当您想以非文档顺序处理子项时,在选择表达式中具有选择性主要有用。

于 2013-01-24T11:13:14.463 回答