使用xslt拆分具有多个值的xml文件

时间:2016-12-16 09:17:36

标签: xslt-2.0

尝试将具有多个元素的xml文件拆分为具有不同元素的单独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>

1 个答案:

答案 0 :(得分: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>

这应该可以根据您显示的示例输入执行您想要的操作,但是,对于任何其他输入,它是否做正确的事情是任何人的猜测,因为您已经指定了要求。