使用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转换器。也许我不应该相信它?
答案 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