复制一个组元素下的匹配元素

时间:2017-05-04 10:56:00

标签: xslt-2.0

我有一个扁平的xml,我需要在一个元素下复制所有匹配的元素。

在输入xml中有标题元素可以随机出现在xml中。我想把它们放在一个元素之下。有什么帮助吗?

输入:

<root>
   <element>
      <para>Text 11.</para>
      <para>Text 22.</para>
    </element>
   <title number="1">
      <title.block>Title1</title.block>
      <para>Text 33.</para>
      <para>Text 44.</para>
   </title>
   <title number="2">
      <title.block>Title2</title.block>
   </title>
   <element1>
      <para>Some Text</para>
   </element1>
   <title number="3">
       <title.block>Title2</title.block>
       <para>Text 55.</para>
   </title>
   <result>
      <para>Some Text</para>
   </result>
</root>

期望的输出是:

<root>
   <element>
      <para>Text 11.</para>
      <para>Text 22.</para>
    </element>
    <title.group>
   <title number="1">
      <title.block>Title1</title.block>
      <para>Text 33.</para>
      <para>Text 44.</para>
   </title>
   <title number="2">
      <title.block>Title2</title.block>
   </title>
   <title number="3">
       <title.block>Title2</title.block>
       <para>Text 55.</para>
   </title>
   </title.group>
   <element1>
      <para>Some Text</para>
   </element1>
   <result>
      <para>Some Text</para>
   </result>
</root>

1 个答案:

答案 0 :(得分:0)

只需为创建该组的第一个title编写一个模板,并将该标题和所有后续兄弟姐妹复制到该组中:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

    <xsl:output indent="yes"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="root/title[1]">        
        <title-group>
            <xsl:copy-of select="., following-sibling::title"/>
        </title-group>
    </xsl:template>

    <xsl:template match="root/title[position() gt 1]"/>

</xsl:transform>

http://xsltransform.net/a9Giwu