使用属性复制xml文档

时间:2012-02-28 16:04:37

标签: 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>

2 个答案:

答案 0 :(得分:4)

最短的解决方案

<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')

文档节点子节点的适当应用

答案 1 :(得分:2)

该样式表似乎很奇怪,但请尝试将xsl:apply-templates更改为:

<xsl:apply-templates mode="abc" select="@*|node()"/>