使用XSLT将XML拆分为多个文件

时间:2010-10-27 18:03:56

标签: xml xslt

我很难绕过XSLT,但我听说可以将XML文件拆分成多个文件。基本上我想将所有元素复制到第一个文件和最后一个文件之后,然后为每个输出文件添加单个文件内容。

如果有可能,有人可以给我一些指示吗?

谢谢,

complete.xml

<rootelem>
  <elem>
    <file attr1='1'>
      <content>content file 1</content>
    </file>
    <file attr2='2'>
      <content>content file 2</content>
    </file>
    <file attr3='3'>
      <content>content file 3</content>
    </file>
  </elem>
</rootelem>

输出:

complete_PART1.xml

<rootelem>
  <elem>
     <file attr1='1'>
        <content>content file 1</content>
     </file>
  </elem>
</rootelem>

complete_PART2.xml

<rootelem>
  <elem>
    <file attr2='2'>
      <content>content file 2</content>
    </file>
  </elem>
</rootelem>

complete_PART3.xml

<rootelem>
  <elem>
     <file attr3='3'>
        <content>content file 3</content>
     </file>
  </elem>
</rootelem>

3 个答案:

答案 0 :(得分:15)

回应你对@Dimitre答案的评论......

你写道,

<xsl:template match="/">
  <xsl:for-each select="elem/file">
    <xsl:result-document method="xml" href="file_{@id}-output.xml">
      <xsl:copy-of select="."/>
    </xsl:result-document>
  </xsl:for-each>
</xsl:template> 

这与您的XML不完全匹配,后者将rootelem作为最外层元素,并且您的注释将root称为最外层元素。你可能想要这样的东西:

<xsl:template match="/root">
  <xsl:for-each select="elem/file">
    <xsl:result-document method="xml" href="file_{@id}-output.xml">
      <root>
        <xsl:copy-of select="/root/@*" />
        <elem>
          <xsl:copy-of select="../@* | ." />
        </elem>
      </root>
    </xsl:result-document>
  </xsl:for-each>
</xsl:template> 

你可能会变得更加漂亮,尝试使用<xsl:copy>而不是root和elem的文字结果元素,但除非它们会发生变化,否则它似乎不值得。

答案 1 :(得分:13)

纯XSLT 1.0 无法生成多个输出文件。可以使用 <exslt:document> 扩展元素来实现此目的。

在XSLT 2.0中使用<xsl:result-document>元素。

答案 2 :(得分:2)

如果你想使用

<xsl:result-document method="xml" href="file_{@id}-output.xml">

来自ANT xslt调用,您需要使用2.0。,只需在ANT调用中添加以下内容:

<classpath location="/home/ap/saxon/saxon8.jar" />

并指定版本=“2.0” 并享受文件分割。