1

我的 xslt 引擎有一些设计问题。很快,我将 XML 文档转换为其他 XML 文档(第一个是元模型,第二个是 OpenDocument XML)。

有一次,我想根据某些条件输出元素的内容文本节点。让我们使用一个虚拟示例:

<father haircolor='blond'>
    <son>
        some text
    </son>
    <sister>
        some stupid text
    </sister>
</father>

我想输出<son>元素的文本节点,如果它的父节点是“金发父亲”并且它有一个妹妹跟随

我对此有不同的解决方案:

首先是使用精确的模式:

<xsl:template match="father[haircolor='blond']>...</xsl:template>

<xsl:template match="son[following-sibling::sister]>...</xsl:template>

其次是在模板中使用模式属性:

<xsl:template match="father[haircolor='blond' and son and sister]">
    <xsl:apply-template select='*' mode='ConditionsAreOk'/>
</xsl:template>

第三是在叶子模板中使用 xsl:if :

<xsl:template match="son">
    <xsl:if test="parent::father/@haircolor = 'blond' and following-sibling::sister>
         {.}
    </xsl:if>
</xsl:template>

由于我关心我的 xslt 代码的可读性和可维护性,我想选择最好的方法。需要明确的是,我不寻求“如何”的帮助,而是“哪种方式最好”。

我的实际想法:我认为第一种方式是最纯粹的 XSLT,但当条件复杂且涉及多个元素时,它可能会非常硬核。我将不得不创建几个特定的​​模板。我更喜欢最后一个,因为在 xsl:if 测试条件下,我只有一个带有硬核 XPath 的模板,而不是几个具有特定匹配的模板。它的代码和文档更少(但是,您必须记录 XPath,否则您将在 5 分钟内忘记它……)。

有什么意见吗?

4

1 回答 1

1

我强烈建议尽可能避免显式条件指令,而改用模板匹配模式

在这种特殊情况下,我会使用:

<xsl:template match="father[haircolor='blond']/son[following-sibling::sister]>
  <!-- your code here -->
</xsl:template>

所以,它只是一个单一的模板——而不是两个——模板主体内的代码已经摆脱了难以阅读、理解和维护的条件指令。

我自己的原则是

如果代码包含明确的条件指令,那么它肯定需要改进。

于 2012-09-30T13:21:20.160 回答