xsl:text元素中的空格

时间:2019-02-07 11:01:29

标签: xslt xslt-1.0

我有以下样式表:

<?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

正确的行为是什么?这里的空白应该被剥离吗?

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解析器并在必要时更改选项。