2017-06-26 3 views
0

私はこのフラットxmlを持っています。私はh1/title上のコンテンツをグループ化し、次のh1/titleパターンが存在する場合はそれまでのすべてのparaをコピーし、空のparaを追加する必要があります。XSLT新しいグループ内の次の要素をコピーする方法

ソースXML:

<Element> 
    <h1> 
     <title>Name1</title> 
    </h1> 
    <h1> 
     <title>Name2</title> 
    </h1> 
    <para>Test1</para> 
    <para>Test2</para> 
    <h1> 
     <title>Name3</title> 
    </h1> 
    <para>Test3</para> 
    <para>Test4</para> 
</Element> 

私は以下のような出力をしたいです。

<Element> 
    <group> 
    <h1> 
     <title>Name1</title> 
    </h1> 
    <para> </para> 
    </group> 
    <group> 
    <h1> 
     <title>Name2</title> 
    </h1> 
    <para>Test1</para> 
    <para>Test2</para> 
    </group> 
    <group> 
    <h1> 
     <title>Name3</title> 
    </h1> 
    <para>Test3</para> 
    <para>Test4</para> 
    </group> 
</Element> 

これまでのテンプレートを試してみましたが、次のパラがコピーされていません。

<xsl:template match="h1"> 
    <group> 
     <xsl:copy> 
     <xsl:for-each-group select="*" group-starting-with="h1"> 
      <xsl:choose> 
       <xsl:when test="self::h1"> 
        <group> 
         <xsl:apply-templates select="current-group()"/> 
         <xsl:apply-templates select="following-sibling::para[not(following::h1)]"/> 
        </group> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:apply-templates select="current-group()"/> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:for-each-group> 
     </xsl:copy> 
    </group> 
</xsl:template> 

答えて

0

私はグループにElement要素の子を示唆し、その後の進路for-each-groupあなたは、単に空のparaを追加する第二のグループの項目がないかどうかを確認することができますの内側になります。

<?xml version="1.0" encoding="UTF-8" ?> 
<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="Element"> 
     <xsl:copy> 
      <xsl:for-each-group select="*" group-starting-with="h1"> 
       <xsl:choose> 
        <xsl:when test="self::h1"> 
         <group> 
          <xsl:apply-templates select="current-group()"/> 
          <xsl:if test="not(current-group()[2])"> 
           <para/> 
          </xsl:if> 
         </group> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:apply-templates select="current-group()"/> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:for-each-group> 
     </xsl:copy> 
    </xsl:template> 

</xsl:transform> 

オンライン:http://xsltransform.net/naZXpX7

関連する問題