我很难绕过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>
答案 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” 并享受文件分割。