如果 xslt 中的条件是否有任何一行,例如假设我只想基于某些条件添加属性
例如
<name (conditionTrue then defineAttribute)/>
只是为了避免如果
<xsl:if test="true">
<name defineAttribute/>
</xsl:if>
如果 xslt 中的条件是否有任何一行,例如假设我只想基于某些条件添加属性
例如
<name (conditionTrue then defineAttribute)/>
只是为了避免如果
<xsl:if test="true">
<name defineAttribute/>
</xsl:if>
您可以使用它<xsl:element>
来创建输出元素<xsl:attribute>
及其属性。然后添加条件属性很简单:
<xsl:element name="name">
<xsl:if test="condition">
<xsl:attribute name="myattribute">somevalue</xsl:attribute>
</xsl:if>
</xsl:element>
这是一个如何完全避免需要指定的示例<xsl:if>
:
让我们拥有这个 XML 文档:
<a x="2">
<b/>
</a>
并且我们只想在父级的属性值为偶数的情况下添加到b
属性中。parentEven="true"
x
b
以下是在没有任何明确的条件指令的情况下如何做到这一点:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="a[@x mod 2 = 0]/b">
<b parentEven="true">
<xsl:apply-templates select="node()|@*"/>
</b>
</xsl:template>
</xsl:stylesheet>
当此转换应用于上述 XML 文档时,会产生所需的正确结果:
<a x="2">
<b parentEven="true"/>
</a>
请注意:
使用模板和模式匹配可以完全消除指定显式条件指令的需要。XSLT 代码中显式条件指令的存在应被视为“代码异味”,应尽可能避免。