我想进行身份XSLT转换,它只是将所有标签从输入XML复制到输出XML。
我的XSLT模板如下所示:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="relation"/>
</xsl:stylesheet
问题是我的XML的第一行是
<?xml version="1.0" encoding="UTF-8" ?>
永远不会复制。
另一个问题是,此转换会为我的XML文件添加几个新行和空格。
是否有可能解决这些问题?
答案 0 :(得分:1)
这是因为您明确省略了XML声明并使用xsl:output
元素(及其相应的属性)缩进输出。
有关详细信息,请参阅规范:http://www.w3.org/TR/xslt/#output
您还应该查看whitespace stripping,了解xsl:strip-space
可能会如何改变您的输出。
此外,更传统的identity transform将如下所示:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
如果您需要省略评论和处理说明,可以覆盖此模板或将node()
更改为*|text()
。
答案 1 :(得分:1)
AFAIK,无法复制 XML声明,因为XML解析器无法使其可供XSLT处理器使用。
您无论如何都不希望将声明原样复制到,因为您的输出可能会使用不同的编码。最好使用{{1}}指令来提供您自己的声明来控制其内容。
另请注意,XML声明是可选的 - 因此您实际上不应该对当前输出有任何问题。
答案 2 :(得分:0)
未能复制XML声明是因为XML声明不是XSLT处理器看到的XDM模型的一部分 - 这反过来是因为它是关于词法表示的信息,它低于XSLT所关注的级别用。
额外的空格可能是因为你使用了indent =“yes”。