使用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转换器。也许我不应该相信它?
发布于 2013-04-23 02:35:03
xml:space="preserve"告诉使用xml:space的应用程序,您希望保留仅包含空白的文本节点,这些节点是xml:space属性所属元素的后代。在本例中,您将xml:space作为<xsl:apply-templates>的一个属性,但是<xsl:apply-templates>没有纯空格的文本节点后代,因此xml:space没有可能的效果。
我认为您希望保留输入XML文档(而不是XSLT样式表)中的纯空格文本节点。在这种情况下,需要将xml:space放在输入文档中,而不是放在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-23 02:31:57
根据规范,不会为属性保留空格-在此帖子中会突出显示空格。Preserving attribute whitespace in XSLT
https://stackoverflow.com/questions/16154092
复制相似问题