使用具有不同标记数量的xslt将XML拆分为不同的XML

时间:2017-06-08 10:01:52

标签: xml xslt

这是一个示例xml,我必须分成多个文件。 我曾尝试使用结果文档和组的多种方式,但在所有示例中,split都是平均分配的。

<?xml version="1.0" encoding="UTF-8"?>
<Sample>
   <A>
      <para>A A A A A A A</para>
   </A>
   <B>
      <para>B B B B B B B</para>
      <child1level1>
         <para>first child first level</para>
         <child1level2>
            <para>second level child</para>
         </child1level2>
      </child1level1>
      <child2level1>
         <para>second child first level</para>
      </child2level1>
   </B>
   <C>
      <para>C C C C C C C</para>
   </C>
   <D>
      <para>D D D D D D D</para>
   </D>
   <G>
      <para>GGGGGGGGGGGGGGGG</para>
      <child1level1>
         <para>first child first level</para>
         <child1level2>
            <para>second level child</para>
         </child1level2>
      </child1level1>
      <child2level1>
         <para>second child first level</para>
      </child2level1>
   </G>
   <E>
      <para>E E E E E E E E E</para>
   </E>
   <F>
      <child1level1>
         <para>first child first level</para>
         <child1level2>
            <para>second level child</para>
         </child1level2>
      </child1level1>
      <child2level1>
         <para>second child first level</para>
      </child2level1>
      <para>F F F F F F F F F</para>
   </F>
   <G>
      <para>GGGGGGGGGGGGGGGG</para>
   </G>
   <H>
      <para>H H H H H H H</para>
   </H>
   <I>
      <para>I I I I I I I</para>
   </I>
   <H>
      <para>H H H H H H H</para>
   </H>
</Sample>

我必须根据组拆分主XML:

  • ABCD
  • EF
  • ħ
  • I
  

*在此XML G&amp; H出现了2次,因此我不得不将它们视为不同的群体。

Output1.xml

<?xml version="1.0" encoding="UTF-8"?>
<split>
   <A>
      <para>A A A A A A A</para>
   </A>
   <B>
      <para>B B B B B B B</para>
      <child1level1>
         <para>first child first level</para>
         <child1level2>
            <para>second level child</para>
         </child1level2>
      </child1level1>
      <child2level1>
         <para>second child first level</para>
      </child2level1>
   </B>
   <C>
      <para>C C C C C C C</para>
   </C>
   <D>
      <para>D D D D D D D</para>
   </D>
</split>

Output2.xml

<?xml version="1.0" encoding="UTF-8"?>
<split>
   <G>
      <para>GGGGGGGGGGGGGGGG</para>
      <child1level1>
         <para>first child first level</para>
         <child1level2>
            <para>second level child</para>
         </child1level2>
      </child1level1>
      <child2level1>
         <para>second child first level</para>
      </child2level1>
   </G>
</split>

Output3.xml

<?xml version="1.0" encoding="UTF-8"?>
<split>
    <G>
        <para>
            GGGGGGGGGGGGGGGG
        </para>
    </G>
</split>

这些只是3个输出文件。其他是这样的。输出文件也应该有一个root标签,我使用split标签作为根标签。

1 个答案:

答案 0 :(得分:0)

解决这个问题的一种方法可能是使用group-starting-with="*[local-name() = $start-group-with]",其中参数被定义为一组元素名称<xsl:param name="start-group-with" as="xs:string+" select="'A', 'E', 'G', 'H', 'I'"/>来启动一个组:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:param name="start-group-with" as="xs:string+" select="'A', 'E', 'G', 'H', 'I'"/>

    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>

    <xsl:template match="/*">
        <xsl:for-each-group select="*" group-starting-with="*[local-name() = $start-group-with]">
            <xsl:result-document href="split-group-{position()}-key-{local-name()}.xml">
                <Split>
                    <xsl:copy-of select="current-group()"/>
                </Split>
            </xsl:result-document>
        </xsl:for-each-group>
    </xsl:template>

</xsl:stylesheet>

当然,在“E”,“G”,“H”,“I”之前跟随任何元素的A元素组合,但是您没有准确地描述什么是标准,您将相邻的ABCD元素组合在一起的示例输入,EF,以及将每个GHI放入其自己的群组/文件中。