2016-10-17 12 views
0

イベントのリストを含むXMLファイルがあります。各イベントは、実際には、beginおよびendイベントです。次のXMLを仮定します。私は適用することは、このように見えるものですテンプレート内のノードを再グループ化する

<Events> 
    <Event id="1" type="begin" date="xxxx"/> 
    <Event id="2" type="end" date="xxxy"/> 
    <Event id="3" type="begin" date="xxyx"/> 
    <Event id="4" type="end" date="xyxx"/> 
    <Event id="5" type="begin" date="yxxx"/> 
    <Event id="6" type="end" date="xxyy"/> 
</Events> 

<Events> 
    <xsl:apply-templates select="//Event"/> 
</Events> 

<xsl:template match="Event"> 
    <Period> 
     <Begin> 
      <Event> 
       <xsl:attribute name="id" select="[@type='begin']/@id"/> 
       <xsl:attribute name="date" select="[@type='begin']/@date"/> 
      </Event> 
     </Begin> 
     <End> 
      <Event> 
       <xsl:attribute name="id" select="[@type='end']/@id"/> 
       <xsl:attribute name="date" select="[@type='end']/@date"/> 
      </Event> 
     </End> 
    </Period> 
</xsl:template> 

は、予想される結果はこのようになります:

<Events> 
    <Period> 
     <Begin> 
      <Event id="1" type="begin" date="xxxx"/> 
     </Begin> 

     <End> 
      <Event id="2" type="end" date="xxxy"/> 
     </End> 
    </Period> 

    <Period> 
     <Begin> 
      <Event id="3" type="begin" date="xxyx"/> 
     </Begin> 

     <End> 
      <Event id="4" type="end" date="xyxx"/> 
     </End> 
    </Period> 

    <Period> 
     <Begin> 
      <Event id="5" type="begin" date="yxxx"/> 
     </Begin> 

     <End> 
      <Event id="6" type="end" date="xxyy"/> 
     </End> 
    </Period> 
</Events> 

しかし、結果がこれです1:

<Events> 
    <Period> 
     <Begin> 
      <Event id="1" type="begin" date="xxxx"/> 
     </Begin> 

     <End> 
      <Event id="" type="end" date=""/> 
     </End> 
    </Period> 

    <Period> 
     <Begin> 
      <Event id="" type="begin" date=""/> 
     </Begin> 

     <End> 
      <Event id="2" type="end" date="xxxy"/> 
     </End> 
    </Period> 

    ... 

</Events> 

私はこの結果を得た理由を理解しています。なぜなら、テンプレートは要素を順番に要素にマッチさせるからですが、「同時に2つのノード」に一致するテンプレートを使用して目標を達成する方法があるかどうかを知りたいですか?私はそれを見てきましたが、私が望む解決策の近くにある唯一のものはMuenchianグループです(上記のような小さなデータセットのセットアップは本当に複雑です)。

答えて

2

まあ、このようなことは仕事をしなければならない - 私は<Event type="begin">の直後に対応する<Event type="end">が常にあると仮定しています。

<xsl:template match="Event[@type='begin']"> 
    <Period> 
     <Begin> 
      <xsl:copy-of select="."/> 
     </Begin> 
     <End> 
      <xsl:copy-of select="following-sibling::Event[1]"/> 
     </End> 
    </Period> 
</xsl:template> 

ここにデモ:http://xsltransform.net/ejivdH4

+0

テンプレートは '[タイプ@ = '開始']'どのように以下の-兄弟 'end'タイプで来るとイベントと一致した場合は?あなたはすべての 'イベント'と一致してはいけませんか? – Jacks

+1

私は 'Event [@ type = 'end']'の明示的なコピーを選択して実行します。この場合、 'イベント 'を処理するための"マッチ "は必要ありません。さらに、私は変換プロセスでこれらの要素をマッチングさせないようにする必要があります。 – potame

+0

わかりました。あなたの答えをありがとう、私の場合は「兄弟姉妹」が行方不明だったし、それはトリックでした。再びありがとう ! – Jacks

関連する問題