Xslt 复制源xml和其他详细信息

Xslt 复制源xml和其他详细信息,xslt,xslt-2.0,Xslt,Xslt 2.0,源文件 <?xml version="1.0" encoding="UTF-8"?> <!--It will contain more data, just given few here--> <Food> <Menu>Item1</Menu> </Food> 要求输出: <?xml version="1.0" encoding="UTF-8"?> <Detail> <SubDetail>

源文件

<?xml version="1.0" encoding="UTF-8"?>
<!--It will contain more data, just given few here-->
<Food>
<Menu>Item1</Menu>
</Food>
要求输出:

<?xml version="1.0" encoding="UTF-8"?>
<Detail>
<SubDetail>
<Food>
<Menu>Item1</Menu>
</Food>
</SubDetail>
</Detail>

我想添加的是,源XML在Detail和SubDetails之间包含200多行。您能告诉我如何编写xslt吗。

仅使用您提供的示例数据,您可以稍微修改标识模板以获得所需的输出

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="no"/>

  <xsl:template match="/">
    <Detail>
      <SubDetail>
        <xsl:apply-templates/>
      </SubDetail>
    </Detail>
  </xsl:template>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

简单说明一下:如果要复制所选节点及其所有内容,也可以使用命令,而不是显式递归复制。可以在一个模板中使用一个xsl命令复制整个输入文档和包装器元素。您的最终用例可能更复杂,但逻辑是相同的

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output indent="yes" omit-xml-declaration="no" encoding="UTF-8"/>

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

</xsl:stylesheet>

请准确显示输入的外观以及要创建的相应输出。我担心发布一个名为Food的根元素的输入文档和一个相互矛盾的注释会包含更多的数据,这会让人很困惑,因为一个格式良好的XML文档中不能有多个根元素。在应用模板中添加select=@*|节点,如果源文档中出现属性,则会更通用。您还可以使用match/而不是match=Food简化XSLT,并将apply模板放在元素子详细信息之后。@VincentBiragnet听起来不错,完成了。看起来怎么样?我想这就是你提到的应用模板?伯特,你最好把它从第一个应用模板移到第二个应用模板。那就是你需要它的地方。文档根目录不能有属性。如果您仍然试图访问它们,一些解析器会抱怨,这就是为什么我建议移动select而不是在第二个apply模板上复制它。。