我有以下样式表:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/">
<xsl:text>1</xsl:text>
<xsl:text>
</xsl:text>
<xsl:text>2</xsl:text>
</xsl:template>
</xsl:stylesheet>
在Saxon 9.8上运行时,得到以下结果:
1
2
与MSXML 6.0一起运行时,空格被去除,我得到:
1 2
正确的行为是什么?这里的空白应该被剥离吗?
答案 0 :(得分:0)
这与XSLT文档中的空白条带化有关。根据{{3}}(对于XSLT 1.0,这是MSXML所使用的)
如果满足以下任一条件,则保留文本节点:
文本节点的父级的元素名称在的集合中 保留空白的元素名称。
文本节点包含至少一个非空白字符。如 XML,空白字符是#x20,#x9,#xD或#xA。
文本节点的祖先元素具有xml:space属性,并带有 保留的值,并且没有更近的祖先元素具有xml:space和 默认值。
然后显示“ 对于样式表,保留空白的元素名称集仅由xsl:text组成。”
因此,看起来MSXML没有遵循规范。
但是,如果您将xml:space="preserve"
添加到有问题的xsl:text
中,您可能会发现它确实可以在MSXML中工作
<xsl:template match="/">
<xsl:text>1</xsl:text>
<xsl:text xml:space="preserve">
</xsl:text>
<xsl:text>2</xsl:text>
</xsl:template>
答案 1 :(得分:0)
正确的行为是从撒克逊人那里看到的。
这里有一些历史,我不记得完整的细节,但是MSXML有一个讨厌的习惯,即在解析器本身中剥离空白文本节点。如果XML解析器去除了空白文本节点,那么它们永远都不会到达XSLT处理器,因此,是否符合所有XSLT规则都没有区别。
我非常确定MSXML中有一些选项可以控制此行为,因此请准确检查您如何调用MSXML解析器并在必要时更改选项。