我想知道 XSLT 中是否有办法修改/添加到属性值。
现在我只是替换属性值:
<a class="project" href="#">
<xsl:if test="new = 'Yes'">
<xsl:attribute name="class">project new</xsl:attribute>
</xsl:if>
</a>
但我不喜欢第project
2 行中的重复。有没有更好的方法来做到这一点,例如简单地添加 new
到属性的末尾?
谢谢你的帮助!
您可以将if
内部放入attribute
而不是相反:
<a href="#">
<xsl:attribute name="class">
<xsl:text>project</xsl:text>
<xsl:if test="new = 'Yes'">
<xsl:text> new</xsl:text>
</xsl:if>
</xsl:attribute>
</a>
An<xsl:attribute>
可以包含任何有效的 XSLT 模板(包括for-each
循环、应用其他模板等),唯一的限制是实例化此模板只能生成文本节点,而不是元素、属性等。属性值将是所有这些的串联文本节点。
在 XSLT 1.0 中,可以使用这种单线:
<a class="project{substring(' new', 5 - 4*(new = 'Yes'))}"/>
这是一个完整的转换:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/*">
<a class="project{substring(' new', 5 - 4*(new = 'Yes'))}"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于以下 XML 文档时:
<t>
<new>Yes</new>
</t>
产生了想要的正确结果:
<a class="project new"/>
说明:
AVT(属性值模板)的使用
要根据条件选择字符串,在 XPath 1.0 中,可以使用 substring 函数并指定一个表达式作为起始索引参数,当条件为时该表达式的值为 1true()
并且某个数字大于字符串的长度 - - 否则。
我们使用的事实是,在 XPath 1.0 中*
(乘法)运算符的任何参数都转换为数字,number(true()) = 1
并且number(false()) = 0
二、XSLT 2.0 解决方案:
使用这个单线:
<a class="project{(' new', '')[current()/new = 'Yes']}"/>
这是一个完整的转换:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/*">
<a class="project{(' new', '')[current()/new = 'Yes']}"/>
</xsl:template>
</xsl:stylesheet>
当应用于同一个 XML 文档(上图)时,同样会产生相同的正确结果:
<a class="project new"/>
说明: