2016-07-11 18 views
0

Iamは、他のDTDの特定に参照XMLを変換しようとしているXSLT - 最初のn番目の最初の子を移動し、その子供の残りを置く

入力:

<ref> 
    <a>text</a> 
    <b>text</b> 
    <c>text</c> 
    <d>text</d> 
</ref> 

XSLT:

<xsl:template match="ref"> 
    <ref> 
     <h> 
      <xsl:apply-templates select="./a"/> 
     </h> 
     <g> 
      <xsl:apply-templates /> 
     </g> 
    </ref> 
</xsl:template> 

<xsl:template match="ref/a"> 
    <a> 
     <xsl:apply-templates /> 
    </a> 
</xsl:template> 

出力の導出:

<ref> 
    <h> 
    <a>text</a> 
    </h> 
    <g> 
    <a>text</a> 
    <b>text</b> 
    <c>text</c> 
    <d>text</d> 
    </g> 
</ref> 

所望の出力は:

<ref> 
    <h> 
    <a>text</a> 
    </h> 
    <g> 
    <b>text</b> 
    <c>text</c> 
    <d>text</d> 
    </g> 
</ref> 

私はこれを行うにはモードを使用するか、それを行うにはどのようにすれば、用のテンプレートを呼び出す必要があります。

答えて

0

最後に使用「モードで

<g> 
     <xsl:apply-templates /> 
    </g> 

使用

<g> 
     <xsl:apply-templates select="node() except a"/> 
    </g> 

それを達成するために。

<xsl:template match="ref"> 
    <ref> 
     <h> 
     <xsl:apply-templates select="./a" mode="add"/> 
     </h> 
     <g> 
     <xsl:apply-templates /> 
     </g> 
    </ref> 
</xsl:template> 

<xsl:template match="ref/a"/> 
<xsl:template match="ref/a" mode="add"> 
    <a> 
     <xsl:apply-templates /> 
    </a> 
</xsl:template> 
0

私は、これはあなたがしたいより何である疑いがある:

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

    <xsl:template match="ref"> 
    <ref> 
     <h> 
     <xsl:apply-templates select="./*[1]"/> 
     </h> 
     <g> 
     <xsl:apply-templates select="./*[generate-id() != generate-id(../*[1])]"/> 
     </g> 
    </ref> 
    </xsl:template> 

    <xsl:template match="ref/*"> 
    <xsl:copy> 
     <xsl:apply-templates /> 
    </xsl:copy> 
    </xsl:template> 
+0

私の最初の子とは何もしておらず、n番目の子または複数の子 – Jai

0

代わりのXSLT 2.0

関連する問題