2014-10-31 46 views
0

我想将xml拆分为多个xml,但在所有拆分的xml中必须存在一些常用元素。拆分重新创建XML XSLT

输入

<xmlroot> 
<FileDetails> 
    <Filename>test.xml</FileName> 
    <FileDate>10312014</FileDate> 
</FileDetails> 
<FileInfo> 
    <Test>Hello1</Test> 
</FileInfo> 
<FileInfo> 
    <Test>Hello2</Test> 
</FileInfo> 
</xmlroot> 

输出1

<xmlroot> 
<FileDetails> 
    <Filename>test.xml</FileName> 
    <FileDate>10312014</FileDate> 
</FileDetails> 
<FileInfo> 
    <Test>Hello1</Test> 
</FileInfo> 
</xmlroot> 

OUTPUT2

<xmlroot> 
<FileDetails> 
    <Filename>test.xml</FileName> 
    <FileDate>10312014</FileDate> 
</FileDetails> 
<FileInfo> 
    <Test>Hello2</Test> 
</FileInfo> 
</xmlroot> 
+0

您可以使用XSLT 2.0处理器来使用'xsl:result-document'来创建一个转换的多个结果文件吗? – 2014-10-31 17:09:36

+0

也是真的叫'File1Info','File2Info'等等的元素?或者是否有一组要素具有相同的名称,并且要将每个要素放在它自己的文件中? – 2014-10-31 17:11:27

+0

我刚刚制作了File1Info,File2Info等。实际上,它的Just“FileInfo”中没有1,2之间的 – SatishA 2014-10-31 17:58:11

回答

0

假设XSLT 2.0

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0"> 

<xsl:output indent="yes"/> 

<xsl:template match="/"> 
    <xsl:apply-templates select="*/FileInfo"/> 
</xsl:template> 

<xsl:template match="*/FileInfo"> 
    <xsl:result-document href="Output{position()}.xml"> 
    <xsl:apply-templates select="/*" mode="split"> 
     <xsl:with-param name="target" tunnel="yes" select="current()"/> 
    </xsl:apply-templates> 
    </xsl:result-document> 
</xsl:template> 

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

<xsl:template match="*/FileInfo" mode="split"> 
    <xsl:param name="target" tunnel="yes"/> 
    <xsl:if test="$target is ."> 
    <xsl:next-match/> 
    </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 

如果您需要在XSLT 1.0 Xalan的Java的一个解决方案,但随后这里的Xalan特定的扩展元素的利用是一个例子:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:redirect="http://xml.apache.org/xalan/redirect" 
    extension-element-prefixes="redirect" 
    exclude-result-prefixes="redirect" 
    version="1.0"> 

<xsl:output indent="yes"/> 

<xsl:template match="/"> 
    <xsl:apply-templates select="*/FileInfo" mode="split"/> 
</xsl:template> 

<xsl:template match="*/FileInfo" mode="split"> 
    <redirect:write file="OutputXalanTest{position()}.xml"> 
    <xsl:apply-templates select="/*"> 
     <xsl:with-param name="target" select="current()"/> 
    </xsl:apply-templates> 
    </redirect:write> 
</xsl:template> 

<xsl:template match="@* | node()" name="identity"> 
    <xsl:param name="target"/> 
    <xsl:copy> 
    <xsl:apply-templates select="@* | node()"> 
     <xsl:with-param name="target" select="$target"/> 
    </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*/FileInfo"> 
    <xsl:param name="target"/> 
    <xsl:if test="generate-id($target) = generate-id(.)"> 
    <xsl:call-template name="identity"/> 
    </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 

我只测试,与现有的Xalan的版本Apache的,但希望它的工作原理以及Java JRE中包含的Xalan版本Sun/Oracle。

+0

我看到下面的错误,javax.xml.transform.TransformerConfigurationException:javax.xml.transform.TransformerException:org.xml.sax.SAXException:非法值:#all用于QNAME属性: 模式 – SatishA 2014-10-31 18:26:03

+0

它是一个XSLT 2.0样式表应该与来自http://saxon.sourceforge.net/的Saxon 9等XSLT 2.0处理器一起使用。 Sun/Oracle JRE中的XSLT处理器仅支持XSLT 1.0。 – 2014-10-31 18:29:11