首先,XML 中的属性值中的空格并没有什么问题:粗略地说,属性值规范化将空格字符转换为空格,并在解析文档时将相邻的空格折叠为单个空格,但空格绝对是允许的。编辑:有关此的更多信息,请参见下文。
正如您在评论中提到的那样,马修威尔逊的方法未能在可能的值之间包含空格。但是,他的方法基本上是合理的。拼图的最后一块是您不喜欢多余的空格:这些可以通过使用normalize-space
XPath 函数来消除。
以下样式表将所有部分放在一起 - 请注意,它不会对其输入文档做任何事情,因此出于测试目的,您可以针对任何 XML 文档甚至针对自身运行它,以验证输出是否满足您的要求。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="foo0" select="false()"/>
<xsl:variable name="bar0" select="true()"/>
<xsl:variable name="foo1" select="true()"/>
<xsl:variable name="bar1" select="false()"/>
<xsl:variable name="foo2" select="true()"/>
<xsl:variable name="bar2" select="true()"/>
<xsl:template match="/">
<xsl:variable name="foobar0">
<xsl:if test="$foo0"> foo</xsl:if>
<xsl:if test="$bar0"> bar</xsl:if>
</xsl:variable>
<xsl:variable name="foobar1">
<xsl:if test="$foo1"> foo</xsl:if>
<xsl:if test="$bar1"> bar</xsl:if>
</xsl:variable>
<xsl:variable name="foobar2">
<xsl:if test="$foo2"> foo</xsl:if>
<xsl:if test="$bar2"> bar</xsl:if>
</xsl:variable>
<li>
<xsl:attribute name="class">
<xsl:value-of select="normalize-space($foobar0)"/>
</xsl:attribute>
</li>
<li>
<xsl:attribute name="class">
<xsl:value-of select="normalize-space($foobar1)"/>
</xsl:attribute>
</li>
<li>
<xsl:attribute name="class">
<xsl:value-of select="normalize-space($foobar2)"/>
</xsl:attribute>
</li>
</xsl:template>
</xsl:stylesheet>
编辑:关于在属性值中分隔离散组件的空格问题:XML 规范将许多可能的有效构造定义为属性类型,包括 IDREFS 和 NMTOKENS。第一种情况匹配Names产生式,第二种情况匹配NMTokens产生式;这两个产生式都被定义为包含多个适当类型的值,由空格分隔。因此,以空格分隔的值列表作为单个属性的值是 XML 信息集的固有组成部分。