Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XSLT将XML拆分为多个文件_Xml_Xslt - Fatal编程技术网

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

使用XSLT将XML拆分为多个文件,xml,xslt,Xml,Xslt,我很难理解XSLT,但我听说可以将一个XML文件拆分为多个文件。基本上,我希望将所有元素复制到第一个文件和最后一个文件之后,然后为每个输出文件添加单独的文件内容 如果可能的话,有人能给我一些建议吗 谢谢 complete.xml 输出: 完整的\u PART1.xml 完整的第2部分.xml 完整的第3部分.xml 在纯XSLT1.0中,不可能生成多个输出文件。为此,可以使用扩展元素 在XSLT2.0中,使用元素。回应您对@Dimitre答案的评论 你写道 <xsl:template ma

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

如果可能的话,有人能给我一些建议吗

谢谢

complete.xml

输出:

完整的\u PART1.xml

完整的第2部分.xml

完整的第3部分.xml

在纯XSLT1.0中,不可能生成多个输出文件。为此,可以使用扩展元素


在XSLT2.0中,使用元素。

回应您对@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> 
您可能会更喜欢,尝试对root和elem使用文本结果元素,而不是文本结果元素,但除非它们会发生变化,否则似乎不值得这样做。

如果您想使用

<xsl:result-document method="xml" href="file_{@id}-output.xml">
在ANT xslt调用中,您需要使用2.0.,只需在ANT调用中添加以下内容:

<classpath location="/home/ap/saxon/saxon8.jar" />
并指定版本=2.0
享受文件分割。

好问题,+1。有关XSLT 1.0和2.0标准支持生成多路输出结果的说明,请参见我的回答。我需要将大型XML文件拆分为较小的文件,但是我要写一个程序来做它需要轮询一个文件夹并处理超过x兆的文件-有很多不同的文件类型-例如,我不知道XML结构,所以我需要一个通用的拆分器-这可以用XSLT来完成,还是我应该用.NET XML读取工具来完成?嗨,Dimitre,谢谢你的回答。我现在使用xsl:result文档,它分割文件,但将其作为顶级元素。但是,我希望在生成的每个文件中保留和。有什么建议吗?我可以知道如何在VS2010 professional中配置扩展吗。@Jeevan:我所知道的实现这一点的唯一方法是安装EXSLT-MVP-请参阅Oleg Tkachenko发布的声明:对我来说非常有用。以防对其他人有所帮助:我必须在根节点中包含扩展元素prefixes=exslt,然后它才能正常工作。你说得对,Lars,很抱歉,从实际文件复制时太草率了。我做了一些类似于您所做的事情,但问题是root和elem有各种需要维护的属性。但是,也许我可以用父母的方式,仍然试图用xslt来概括。@Nisse,我编辑了答案以保留root和elem的属性。的xsl:copy的问题在于,您无法修改所复制内容的部分。。。您只需复制所选节点下的整个树。你不能添加或省略任何内容。所以不能使用xsl:copy/root或/root/elem。但是,如果您使用xsl:copy复制所需的属性,您的状态就很好。@millebbi:抱歉,但这可能会涉及到另一个问题,实际上是关于ant与Saxon XSLT处理器集成的问题……这两个问题都会涉及,因为我还想使用:,但是ant默认使用1.0,并且添加了这个ant语句,您可以使用它
<rootelem>
  <elem>
     <file attr3='3'>
        <content>content file 3</content>
     </file>
  </elem>
</rootelem>
<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> 
<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:result-document method="xml" href="file_{@id}-output.xml">
<classpath location="/home/ap/saxon/saxon8.jar" />