1

Doing some work with xsl - first time I've done anything serious, and I've hit something which I can't explain. Easiest way to show it is with the identity transform:

This works:

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

This doesn't (says "Unable to apply transformation on current source"):

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

This does:

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

OK, I can see what's happening. But I don't understand why. Why does xml:space not want to play nicely with attributes? Just curious.

BTW, this is using the xsl translator that's built into Notepad++. Perhaps I shouldn't trust it?

4

2 回答 2

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 处理器是否在做一些非法的事情。作为一个很好的诊断方法,试试像 Saxon 这样受人尊敬的处理器,看看是否有任何错误。

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

建议:

只需使用

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

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

于 2013-04-22T18:35:02.727 回答
0

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

于 2013-04-22T18:31:56.870 回答