2016-12-16 69 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> 

這應該按照你所要顯示的示例輸入做你想做的事情,但是否與任何其他輸入做對的事情是任何人的猜測,因爲你沒有詳細說明需求。