2017-01-30 12 views
0

私は複雑な階層構造のXMLファイルを持っています。これは文書fileName.xmlでコピーします。私は他の要素に新しい要素を挿入したい。対象要素は、入力ファイルに基づいて計算します。concat('b_',$id)です。たとえばについてはxsltの指定された要素に要素を挿入する方法は?

ファイル名.xml

<root> 
<transform id="b_0"> 
    <transform id="b_1"> 
    <transform id="b_2"> 
    <transform id="b_3"/> 
    <transform id="b_4"/> 
    </transform> 
    </transform> 
</transform> 
</root> 

これは結果文書の例である:

<root> 
<transform id="b_0"> 
    <transform id="obj_1"/> 
    <transform id="b_1"> 
    <transform id="b_2"> 
    <transform id="b_3"> 
    <transform id="obj_2"/> 
    </transform> 
    <transform id="b_4"/> 
    </transform> 
    </transform> 
</transform> 
</root> 

私のXSLTコードのパターン:すべての

<xsl:variable name="transforms" select="document('fileName.xml')"/> 
<xsl:variable name="table" select="."/> 
<xsl:template match="tr"> 
    <xsl:variable name="param" select="$table//tr/td[2]"/> 
    <xsl:variable name="id" select="concat('b_',$param)"/> 
    <xsl:copy-of select="$transforms"/> 
    <xsl:copy> 
    <Transform> 
    <xsl:attribute name="id"><xsl:value-of select="concat('obj_', position())"/></xsl:attribute> 
    <xsl:apply-templates select="$transforms/transform[@id = $id]"/> 
    </Transform> 
    </xsl:copy> 
</xsl:template> 

答えて

0

ファースト、あなたが達成しようとしていることを理解することは困難ですが、あなたは変換する入力を表示しません(ただし、タグ名「table」、「tr」、「td」からHTML形式の表を推測しています)。

  • xsl:copy-of -tagコピー(あなたの場合:-variable $transformsの内容)ノードセット:出力
  • xsl:copy -tagコピーにあなたは、いくつかのXSLT-概念で混乱思える

    (あなたのケースでは、tr -tag、それがテンプレートにマッチしているものであるため)、現在のタグを出力する

また、その点に注意してください。

  • position()のみ$transformsのトップレベルにtransform要素と一致します
  • $transforms/transform[@id=$id]、多分それはあなたが望むもので、その親の中に、現在のノード(あなたtr)の相対位置をそうでないかもしれないが返されます。任意のレベルの要素と一致させる場合は、ダブルスラッシュ//を使用してください。今

、あなたが指定した要素の内側に新しい要素を挿入し、指定したとして-variable $transformの内容を変換するために、あなたが作成する必要があります。

  • を入力を出力にコピーするアイデンティティ変換
  • タグがに基づいて、新しい要素を挿入して、あなたが探しているタグがダイナミックなので

をコピーした場合には、あなたが探している1、でない限り、-variable、これはパラメータとして渡す必要があります。あなたのコードに基づいて、私は次の兄弟として@id=$idを持つ要素内に新しい要素を挿入したいと思います。

あなたはこのような本でトランスフォームを作成することができます:私は、それが呼び出されているときに、この上のmodeが(私は、それが特定の状況で呼び出されていないしたい制御できるように変換し

<xsl:template match="node()" mode="tx"> 
    <!-- parameters controlling behaviour as input --> 
    <xsl:param name="id" /> 
    <xsl:param name="pos" /> 
    <!-- copies the current node --> 
    <xsl:copy> 
     <!-- copies attributes of the current node --> 
     <xsl:copy-of select="@*" /> 
     <!-- if the next sibling with tag transform has id=$id, insert a new element --> 
     <xsl:if test="following-sibling::transform[position()=1 and @id=$id]"> 
      <transform> 
       <xsl:attribute name="id"> 
        <xsl:value-of select="concat('obj_', $pos)" /> 
       </xsl:attribute> 
      </transform> 
     </xsl:if> 

     <!-- call recursively, make sure to include the parameters --> 
     <xsl:apply-templates select="node()" mode="tx"> 
      <xsl:with-param name="id" select="$id"/> 
      <xsl:with-param name="pos" select="$pos" /> 
     </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

注意をすべての入力で)。

これは、このようなトランスフォームマッチングTRから呼び出すことができます。

<xsl:template match="tr"> 
    <xsl:variable name="param" select="$table//tr/td[2]" /> 
    <xsl:variable name="id" select="concat('b_',$param)" /> 

    <xsl:apply-templates select="$transforms" mode="tx"> 
     <xsl:with-param name="id" select="$id"/> 
     <xsl:with-param name="pos" select="position()" /> 
    </xsl:apply-templates> 
</xsl:template> 

ここにあり完全に動作する例:http://xsltransform.net/bwdwsA/1

関連する問題