xml:space ='preserve'似乎没有使用xsl:apply-templates select =“node()”

时间:2013-04-22 18:26:06

标签: xslt attributes

使用xsl做一些工作 - 我第一次做了一些严肃的事情,而且我遇到了一些我无法解释的事情。显示它的最简单方法是使用标识转换:

这有效:

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

这不是(说“无法对当前来源应用转换”):

<xsl:template match="@*|node()" xml:space='preserve'>
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

这样做:

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*"/>
    <xsl:apply-templates select="node()" xml:space='preserve'/>
  </xsl:copy>
</xsl:template>

好的,我可以看到发生了什么。但我不明白为什么。为什么xml:space不想很好地使用属性?好奇。

BTW,这是使用内置于Notepad ++中的xsl转换器。也许我不应该相信它?

2 个答案:

答案 0 :(得分:3)

你想要完成什么? xml:space="preserve"告诉消耗XML的应用程序,您希望保留仅为空白的文本节点,这些节点是xml:space属性的元素的后代。在此示例中,您将xml:space作为<xsl:apply-templates>的属性,但<xsl:apply-templates>没有仅限空白的文本节点后代,因此xml:space不会产生任何影响。

我认为您希望保留输入XML文档(而不是XSLT样式表)中仅包含空格的文本节点。在这种情况下,您需要xml:space在输入XML文档中,而不是在XSLT样式表中。样式表可以有xsl:preserve-space-elements="*",但这已经是默认设置,除非您设置了xsl:strip-space-elements

是的,我倾向于想知道Notepad ++(libxml)使用的XSLT处理器是否做了非法的事情。作为一个很好的诊断,尝试像萨克森这样受人尊敬的处理器,看看你是否有任何错误。

或者只是从样式表中删除xml:space,因为即使处理器没有抛出错误也不会对你有任何好处。

建议:

只需使用

<xsl:output method="html" indent="yes"/>

<xsl:stylesheet>的第一个孩子。 indent="yes"将阻止所有输出元素在一行中塞满,因此您可以读取结果。

答案 1 :(得分:0)

根据规范不为属性保留空格 - 在此帖子中突出显示。 Preserving attribute whitespace in XSLT