2016-08-05 2 views
0

ヘイ、XSLTコピー同じ兄弟他の兄弟まで、私はXSLT 1.0を使用して、リスト次変換するtrieingい

を表示されます。

<div data-class="a"/> 
<div data-class="b"/> 
<div data-class="b"/> 
<div data-class="c"/> 
<div data-class="b"/> 
<div data-class="a"/> 
<div data-class="b"/> 
<div data-class="c"/> 
<div data-class="d"/> 
<div data-class="a"/> 
<div data-class="a"/> 

それは次のようにデータを変換する必要があります。

<div data-class="a"> 
    <div data-class="b"/> 
    <div data-class="b"> 
     <div data-class="c"/> 
    </div> 
    <div data-class="b"/> 
</div> 
<div data-class="a"> 
    <div data-class="b"> 
     <div data-class="c"> 
      <div data-class="d"/> 
     </div> 
    </div> 
</div> 
<div data-class="a"/> 
<div data-class="a"/> 
    <div data-class="b"> 
     <div data-class="c"/> 
     <div data-class="c"/> 
    </div> 
</div> 

私は時間からそれを正しく変換しようとしています。 は、私がコピータグを使用しています、それを変換するには、次の

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

<xsl:template match="div[@data-class='a']"> 
    <xsl:copy> 
    <xsl:apply-templates select="node() | @* | following-sibling::div[@data-class='b']" /> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="div[@data-class='a']"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()" /> 
    <xsl:apply-templates select="following-sibling::div[@data-class='b']" /> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="div[@dataclass='b']"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()" /> 
    <xsl:apply-templates select="following-sibling::div[@data-class='c']" /> 
    </xsl:copy> 
</xsl:template> 

問題は、データ・クラスのすべての次の要素が取られていることである - 私を助けてください。 ありがとう!

+0

階層内のいくつかのロジックはありますか?あるいは、明示的に 'b'を' a'の下に、 'c'を' b'の下に置かなければならないのでしょうか? –

答えて

3

私はあなたがそれをこのようにしてみてくださいお勧めします:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="b" match="div[@data-class='b']" use="generate-id(preceding-sibling::div[@data-class='a'][1])" /> 
<xsl:key name="c" match="div[@data-class='c']" use="generate-id(preceding-sibling::div[@data-class='b'][1])" /> 
<xsl:key name="d" match="div[@data-class='d']" use="generate-id(preceding-sibling::div[@data-class='c'][1])" /> 

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

<xsl:template match="/root"> 
    <xsl:copy> 
     <xsl:apply-templates select="div[@data-class='a']"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="div[@data-class='a']"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
     <xsl:apply-templates select="key('b', generate-id())"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="div[@data-class='b']"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()" /> 
    <xsl:apply-templates select="key('c', generate-id())"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="div[@data-class='c']"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()" /> 
    <xsl:apply-templates select="key('d', generate-id())"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

上記は、以下の整形入力例に適用した場合:

XML

<root> 
    <div data-class="a"/> 
    <div data-class="b"/> 
    <div data-class="b"/> 
    <div data-class="c"/> 
    <div data-class="b"/> 
    <div data-class="a"/> 
    <div data-class="b"/> 
    <div data-class="c"/> 
    <div data-class="d"/> 
    <div data-class="a"/> 
    <div data-class="a"/> 
</root> 

結果は以下のようになります。

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <div data-class="a"> 
     <div data-class="b"/> 
     <div data-class="b"> 
     <div data-class="c"/> 
     </div> 
     <div data-class="b"/> 
    </div> 
    <div data-class="a"> 
     <div data-class="b"> 
     <div data-class="c"> 
      <div data-class="d"/> 
     </div> 
     </div> 
    </div> 
    <div data-class="a"/> 
    <div data-class="a"/> 
</root> 
関連する問題