xml - 复制带有属性的 xml 文档

标签 xml xslt

我正在尝试复制包含属性和节点的完整 xml 文档。输出不包含属性。 fi.xml 是输入,test.xsl 进行转换(xsl 中需要一种模式)。谢谢。

f1.xml
<test attr="val">
  <subtest attr2="val2"/>
</test>

test.xsl
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:copy>
      <xsl:apply-templates select="document('f1.xml')" mode="abc"/>
    </xsl:copy>
  </xsl:template>

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

output:
<?xml version="1.0" encoding="UTF-8"?><test>
  <subtest/>
</test>

最佳答案

最短的解决方案:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:copy-of select="document('f1.xml')"/>
 </xsl:template>
</xsl:stylesheet>

更灵活的解决方案,但更简单(无模式)和更标准:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

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

 <xsl:template match="/">
  <xsl:apply-templates select=
       "document('f1.xml')/node()"/>
 </xsl:template>
</xsl:stylesheet>

说明:适当应用identity ruledocument('f1.xml')

的文档节点的子节点上

关于xml - 复制带有属性的 xml 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9485385/

相关文章:

c# - 使用 C# 读取 Soap 消息

Java - 如何将 XML 元素添加到根标记?

asp.net - 根据参数应用不同的 XSLT 模板

xml - XSLT:如何从变量中的某个元素获取值?

java - 如何使用 JiBX 读取 XML 文档?

android - 在android中解析xml时出现异常

xml - 使用 xslt 2.0 拆分 XML 并删除空属性

html - XSL/HTML 表格行数调整

xml - 如何使用 XSLT 转换已转换的 XML

xml - 使用 XSLT 计算差异