【问题标题】:xml:space='preserve' doesn't seem to get on with xsl:apply-templates select="node()"xml:space='preserve' 似乎与 xsl:apply-templates select="node()" 不兼容
【发布时间】:2013-04-15 18:24:37
【问题描述】:

使用 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 不想很好地处理属性?只是好奇。

顺便说一句,这是使用 Notepad++ 中内置的 xsl 翻译器。也许我不应该相信它?

【问题讨论】:

  • 前两个看起来相同。有什么区别?
  • 完全正确!手指麻烦,对不起。现已修复。
  • 好的,我看到了你的修复......但看起来你的问题仍然很困惑。对于将xml:space 应用于属性(#3)的示例,您说“这确实”有效。但是您说“xml:space”不想很好地使用属性。也许你给你的例子贴错了标签?
  • 另外,什么是“当前来源”?如果您在 Notepad++ 中使用缓冲区(或文件),该文件是否可能不是格式正确的 XML?
  • 对不起,也弄错了!太多的测试文件散开!无论如何都不希望这样做,因为属性在节点之前。现在修复... 格式不正确:这是一个公平的问题。我认为来源格式正确(检查过,它在第一种和第三种情况下运行良好)。我可以在评论中发布它吗?

标签: xslt attributes


【解决方案1】:

你想完成什么? xml:space="preserve" 告诉使用 XML 的应用程序您希望保留纯空格文本节点,这些节点是 xml:space 是其属性的元素的后代。在此示例中,您将xml:space 作为&lt;xsl:apply-templates&gt; 的属性,但&lt;xsl:apply-templates&gt; 没有纯空格文本节点后代,因此xml:space 没有可能的效果。

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

是的,我想知道 Notepad++ (libxml) 使用的 XSLT 处理器是否在做一些非法的事情。作为一个很好的诊断方法,试试像 Saxon 这样受人尊敬的处理器,看看是否有任何错误。

要么这样,要么直接从你的样式表中删除xml:space,因为即使处理器没有抛出错误,它也对你没有任何好处。

建议:

随便用

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

作为&lt;xsl:stylesheet&gt; 的第一个孩子。 indent="yes" 将防止所有输出元素挤在一行中,因此您可以阅读结果。

【讨论】:

  • 我只是想避免所有标签都挤在一条线上,这样我就可以阅读结果了!当它工作时,它具有预期的效果:它正确地保留了输入文档中的空白,因为它被转换为输出。不要真正关心在属性中保留或不保留空格 - 无论如何它们都是文明的字符串。只是,令我惊讶的是,当 space='preserve' 开启时,转换器会拒绝继续执行属性 - 我原以为它只是忽略该设置。
  • @Jules: xml:space 在 XSLT 元素上不应影响输出 XML,除非存在作为文字结果元素的后代。如果您希望输入文档中的空格保留在输出文档中,默认情况下会发生这种情况 (w3.org/TR/xslt#strip)。
  • 我想我明白这一点。我在另一个确实包含文字的规则(如下)中发现了问题。所以,虽然我同意在这个例子中它没有帮助,但身份转换是我能找到的最简单的东西,它表明了这个问题。我不明白为什么它会失败。 ` (抱歉 - 无法获得格式)
  • @Jules:查看关于使用indent="yes"的建议。
  • 也这样做了 :-) 似乎没有任何效果(但我输出的是 xml 而不是 html)。我找到了this,但我还没有机会探索它。 (漫长的一天)
【解决方案2】:

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

【讨论】:

  • 我没有抱怨它没有保留属性中的空格。我抱怨转型失败。为什么空间设置不只是在属性内部被忽略?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 2023-03-25
  • 2013-09-08
  • 2019-04-03
相关资源
最近更新 更多