XSLT Identity Transformation删除了第一行XML并更改了idents和换行符

时间:2015-07-20 18:06:13

标签: xml xslt

我想进行身份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文件添加几个新行和空格。

是否有可能解决这些问题?

3 个答案:

答案 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”。