我的 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 分钟内忘记它……)。
有什么意见吗?