2017-10-31 4 views
-1

XSLTの新機能です。私は非常に混乱しています。私は次の問題を解決しなければならない。XSLTを使用した他の形式のXML変形

<root> 
<level_1 name="Level 1"> 
    <level_2 name="Level 2"> 
     <level_3 name="Level 3"> 
      <level_4 name="Level 4"> 
       <level_5 name="Level 5"> 
        <level_6 name="level_6 1" /> 
        <level_6 name="level_6 2" /> 
       </level_5> 
      </level_4> 
     </level_3> 
    </level_2>  
</level_1> 
</root> 

上記のように深くネストされていない形式でこのファイルを変換したいとします。 だから、見えるように持っている:今、すべてのレベルが<level_1>にネストされている

<root> 
<level_1 name="level_1"> 
    <level_2 name="level_2"/> 
    <level_3 name="level_3"/> 
    <level_4 name="level_4"/> 
    <level_5 name="level_5"/> 
    <level_6 name="level_6 1"/> 
</level_1> 
<level_1 name="level_1"> 
    <level_2 name="level_2"/> 
    <level_3 name="level_3"/> 
    <level_4 name="level_4"/> 
    <level_5 name="level_5"/> 
    <level_6 name="level_6 2"/> 
</level_1> 
</root> 

。さらに、ソースXMLには、2つの<level_6>要素があります。私のターゲットXMLでは、これらの2つの要素は異なる<level_1>要素にあります。 XSLTの新機能なので、私は分かりません。

お願いします。

答えて

2

残念ながら、入力と出力の1つの例は仕様を構成しません。スタイルシートがこの入力で何をすべきかだけでなく、他の入力と何をすべきかを知る必要があります。たとえば、リーフノードがすべて同じレベルにない入力ではどうしたらよいでしょうか?要件は、各リーフ要素(子を持たない要素)のパスを展開している場合

しかし、あなたは、この(XSLT 3.0に)試みることができる:

<xsl:template match="root"> 
    <xsl:variable name="root" select="."/> 
    <xsl:copy> 
    <xsl:for-each select="//*[not(*)]"> 
     <xsl:variable name="ancestors" select="ancestor-or-self::* except $root"/> 
     <xsl:copy select="head($ancestors)"> 
     <xsl:copy-of select="@*"/> 
     <xsl:for-each select="tail($ancestors)"> 
      <xsl:copy> 
      <xsl:copy-of select="@*"/> 
      </xsl:copy> 
     </xsl:for-each> 
     </xsl:copy> 
    </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 
関連する問題