代码之家  ›  专栏  ›  技术社区  ›  wasmachien Jon W

xsl:text元素中的空白

  •  0
  • wasmachien Jon W  · 技术社区  · 5 年前

    我有以下样式表:

    <?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 回复  |  直到 5 年前
        1
  •  0
  •   Tim C    5 年前

    这与XSLT文档中的空白条带化有关。根据 W3C specification (对于XSLT1.0,这是MSXML使用的方法)

    如果以下任何一项适用,则保留文本节点:

    文本节点父级的元素名称位于 保留元素名称的空白。

    文本节点至少包含一个非空白字符。如在 XML,空白字符是x20、x9、xd或xa。

    文本节点的祖先元素具有xml:space属性,其中 preserve的值,并且没有更接近的祖先元素具有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>
    
        2
  •  0
  •   Michael Kay    5 年前

    正确的行为就像你从撒克逊看到的那样。

    这里有一些历史,我不记得完整的细节,但是MSXML有一个坏习惯,即在解析器本身中剥离空白文本节点。如果XML解析器除去空白文本节点,那么它们就永远不会到达XSLT处理器,所以这是否符合所有的XSLT规则没有区别。

    我非常确定MSXML中有控制这种行为的选项,因此请检查您是如何调用MSXML解析器的,并在必要时更改这些选项。