【发布时间】:2019-07-15 18:45:52
【问题描述】:
我有以下 XSL 转换代码:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这是身份转换的标准样本。在大多数情况下,它工作得恰到好处。但是当它不能正确复制时,我能够找到一个案例。对于以下 XML 代码:
<c xmlns:x="x">
<a xmlns:x="x"/>
</c>
转换后的 xml 代码如下所示:
<c xmlns:x="x"><a /></c>
如果您从 XML 代码中删除命名空间 xmlns,它就会开始正常工作。此外,如果您更改第二个参数的名称(离开 xmlns 命名空间),您将进行正确的身份转换。我被卡住了,因为我无法解释为什么在完全相同的命名空间中使用相同的参数会造成这样的麻烦。
顺便说一句,您可以在https://www.freeformatter.com/xsl-transformer.html 网页上重现这些错误。
【问题讨论】:
-
这两个结果在语义上是相同的。缩进取决于您的处理器 - 例如,请参见此处的不同结果:xsltfiddle.liberty-development.net/94rmq75 您可以使用
<xsl:output indent="yes"/>和/或xsl:strip-space和xsl:preserve-space指令在一定程度上控制缩进。