2017-08-29 18 views
1

私は最近、私がまだ良い解決策を見つけられなかったという問題に遭遇しました。XSLTツリー階層へのフラットリスト

Iamはフラットな階層を持つXMLファイルを指定し、それを定義された階層に変換する必要があります。

<xml_file> 
<dd/> 
<b/> 
<b/> 
<dd/> 
<b/> 
<b/> 
<dd/> 
<k/> 
<b/> 
<b/> 
<dd/> 
<b/> 
<b/> 
</xml_file> 

私はにそれを有効にする:

<xml_file> 
    <dd> 
     <b/> 
     <b/> 
    </dd> 
    <dd> 
     <b/> 
     <b/> 
    </dd> 
    <dd> 
     <k> 
      <b/> 
      <b/> 
     </k> 
    </dd> 
    <dd> 
     <b/> 
     <b/> 
    </dd> 
</xml_file> 

は何XSLT 2.0を使用してこれを行うための最善の方法だろうか?

ありがとうございました。

編集:

申し訳ありません。私は本当にうまく説明しませんでした..

私は、リスト内のによって構成されている要素のリストを与えられました。

すべて BのKの DD 後は、前DDの子供ことになっています。

すべてBのK後は、前Kの子供ことになっています。

+0

XMLサンプルが実際のXMLを実際に表していますか?現時点では、 'xml_file'とは別に、どのタグも関連する終了タグを持たないため、XSLTはそれを処理できません。 –

+0

階層が「定義されている」ロジックを説明する必要があります。 –

+0

あなたの返信をありがとう。私は自分の質問の説明を更新しました。 – caloemar

答えて

1

あなたは恒等変換テンプレートを足した

<xsl:template match="xml_file"> 
    <xsl:copy> 
     <xsl:for-each-group select="*" group-starting-with="dd"> 
      <xsl:copy> 
       <xsl:for-each-group select="current-group() except ." group-starting-with="k"> 
        <xsl:choose> 
         <xsl:when test="self::k"> 
          <xsl:copy> 
           <xsl:apply-templates select="current-group() except ."/> 
          </xsl:copy> 
         </xsl:when> 
         <xsl:otherwise> 
          <xsl:apply-templates select="current-group()"/> 
         </xsl:otherwise> 
        </xsl:choose> 
       </xsl:for-each-group> 
      </xsl:copy> 
     </xsl:for-each-group> 
    </xsl:copy> 
</xsl:template> 

を使用することができます。