返回XML不变的XSL

返回XML不变的XSL,xml,xslt,Xml,Xslt,我正在寻找一个简单地返回未更改的XML的XSL代码段。这听起来很琐碎,但我似乎在网上的任何地方都找不到一个例子。有人帮忙吗 那么: <xsl:template match ="/"> <xsl:copy-of select="."/> </xsl:template> 也许有更简单的方法吗?这是一个常见的问题,答案称为a。以下模板将正确复制现有XML。然后添加额外的模板来修改行为(例如删除某些元素、重命名元素或属性等) 为了复制完整的XML文档,必须有

我正在寻找一个简单地返回未更改的XML的XSL代码段。这听起来很琐碎,但我似乎在网上的任何地方都找不到一个例子。有人帮忙吗

那么:

<xsl:template match ="/">
  <xsl:copy-of select="."/>
</xsl:template>


也许有更简单的方法吗?

这是一个常见的问题,答案称为a。以下模板将正确复制现有XML。然后添加额外的模板来修改行为(例如删除某些元素、重命名元素或属性等)


为了复制完整的XML文档,必须有一个与根匹配的模板。这可能是:

那么,仅复制当前节点(根节点)就足够了:

因此,其中一个完整的转变是:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
      <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>
身份转换被认为是最基本的XSLT设计模式之一,并且被大量使用,其原因是,通过使用其他更具体的模板覆盖此模板规则,可以非常轻松地执行各种操作,否则将很困难。例如,删除具有特定名称或满足某些其他条件的特定(一组)元素、重命名特定元素、更改特定元素的命名空间、创建特定元素的新子元素或同级元素等


有关使用标识转换的更多信息和代码片段,请务必查看。

我想问题是:为什么要这样做?为什么不简单地按原样写出XML呢?这对于开始学习XSL、它的功能和局限性等的人来说是一个很好的机会。公认的答案是不正确的,应该纠正。第一行应该是,不?哦,第三行应该是不正确的。怎么做?请解释一下,而不是把它降下来。我们其他人可能会学到一些东西@jamesbrady感谢您的语法更正。我真的很想知道这是否还有其他问题?我仍然相信这是对问题的正确答案。除非克莱特斯和那帮人能解释为什么不能,我相信他们回答的是一个不同的问题——也许是他们想问的问题?不幸的是,这是错误的。无法保持XML文档不变,因为XSLT无法访问doctype声明;您可以复制实际的XML数据,但不能声称它是未更改的,因为转换的输出不会保留doctype声明。@Flynn1179:XSLT不在词汇级别上操作。它在树上运行。也就是说,在解析XML的字符串表示形式之后。结果文档中可能会出现一些词汇层面的差异。所有这些都是已知的,没有人假装结果文档与源文档逐字符相同。XSLT保证的是结果文档和所需文档将与树相同。我不反对这一点,但我的观点是,任何XSLT的结果都不会输出与原始XML相同的文档。无论它是如何表示的,doctype表示都是XML的一部分,不能保存在转换后的输出中;当然,您可以让树保持不变,但XML不仅仅是一棵树。@flyn1179:没有人会争论这一点。这在XSLT规范中有说明。
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
      <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>
<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>