2016-12-16 59 views
0

试图将具有多个元素的xml文件拆分为具有不同元素的单独xml。使用xslt分割具有多个值的xml文件

输入文件:

<Person> 
<firstname>ABC</firstname> 
<lastname>ABC</lastname> 
<address>address1</address> 
<address>address2</address> 
<city>city</city> 
<state>state</state> 
<currency>currency1</currency> 
<currency>currency2</currency> 
</Person> 

Need to split above file into two files as 
Output file-1 

<Person> 
<firstname>ABC</firstname> 
<lastname>ABC</lastname> 
<address>address1</address> 
<city>city</city> 
<state>state</state> 
<currency>currency1</currency> 
</Person> 

输出文件-2

<Person> 
<firstname>ABC</firstname> 
<lastname>ABC</lastname> 
<address>address2</address> 
<city>city</city> 
<state>state</state> 
<currency>currency2</currency> 
</Person> 
+0

是否总会有两个地址和货币元素?还是各种各样,元素数量未知? –

+0

将会有超过2个元素,但所有元素都将被知道。 – Rajeev

回答

0

这里有一个通用的解决方案,输出N个文件,其中N是相同名称的子元素的最大数量,其中文件N包含每个元素名称的第N个实例(如果至少有N个),否则为第一个实例:

<xsl:template match="/*"> 
    <xsl:variable name="this" select="."/> 
    <xsl:variable name="names" select="distinct-values(*/name())"/> 
    <xsl:for-each select="1 to max(
      for $name in $names return count(*[name()=$name]))"/> 
    <xsl:variable name="n" select="."/> 
    <xsl:result-document href="file{.}"> 
     <xsl:element name="{name($this)}"> 
     <xsl:for-each-group select="$this/*" group-by="name()"> 
      <xsl:copy-of select="(current-group()[$n], .)[1]"/> 
     </xsl:for-each-group> 
     </xsl:element> 
    </xsl:result-document> 
    </xsl:for-each> 
</xsl:template> 

这应该按照你所要显示的示例输入做你想做的事情,但是否与任何其他输入做对的事情是任何人的猜测,因为你没有详细说明需求。