xslt

2016-12-16 8 views
0

複数の要素を持つxmlファイルを異なる要素を持つ別々のxmlに分割しようとすると、複数の値を持つxmlファイルが分割されます。xslt

入力ファイル:NファイルNが含まれている同じ名前の子要素の最大数は、ここで

<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

常に2つの住所と通貨の要素がありますか?または、要素の数が不明で、さまざまですか? –

+0

2つ以上の要素がありますが、それらのすべてがわかります。 – Rajeev

答えて

0

ここでは、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> 

これはあなたが示した入力例で必要なものを行うはずですが、要件を満たしていないため他の入力と正しいことをするかどうかは誰でも推測できます。