2016-04-04 12 views
0

XMLファイルをXSLT 1.0で変換しようとしていますが、これに問題があります。XSLT 1.0の変換

入力

<task_order> 
<Q> 
    <record id="1"> 
     <column name="task_externalId">SPLIT4_0</column> 
    </record> 
    <record id="2"> 
     <column name="task_externalId">SPLIT4_1</column> 
    </record>  
</Q> 
<task> 
    <id>SPLIT4</id> 
    <name>test</name> 
</task> 
</task_order> 

募集結果:各task_order要素について

:1以上のレコード要素(4分割とSPLIT4_1)があるとき、私はタスク要素を複製する必要がありますidを元のタスクIDをレコード要素から変更します。

<task_order> 
<Q> 
    <record id="1"> 
     <column name="task_externalId">SPLIT4_0</column> 
    </record> 
    <record id="2"> 
     <column name="task_externalId">SPLIT4_1</column> 
    </record>  
</Q> 
<task> 
    <id>SPLIT4_0</id> 
    <name>test</name> 
</task> 
<task> 
    <id>SPLIT4_1</id> 
    <name>test</name> 
</task> 
</task_order> 

お勧めはありますか?

+0

私はあなたが達成したいもののロジックを取得しないを試してみて、各

<xsl:template match="task"> <xsl:variable name="task" select="." /> <xsl:for-each select="key('column', id)"> <!-- Create new task --> </xsl:for-each> </xsl:template> 

のための新しいtask要素を作成します。結果に ''/''をどのようにマッピングしますか?なぜ、最初の ''要素で* SPLIT4_0 *が* SPLIT_4 *に変更されたのですか? – potame

+0

さて、タスク要素(SPLIT4)が配信されるインターフェイスですが、他のアプリケーションにはインターフェイスからの値で更新する必要がある2つのタスク(SPLIT4_0とSPLIT_1)があります。 – Jos

+0

あなたの最後の声明は私の側のエラーでした – Jos

答えて

0

まず少し簡単に列を検索するために、既存のすべてのノード

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

間で次のコピーを処理するアイデンティティーテンプレートから始め、xsl:key

の使用を検討していただき、ありがとうございます
<xsl:key name="column" match="column" use="substring-before(., '_')" /> 

次に、taskと一致するテンプレートがあります。ここでは、一致するすべてを参照できます。column elemen TSキーを使用して、このXSTL

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:key name="column" match="column" use="substring-before(., '_')" /> 

    <xsl:template match="task"> 
     <xsl:variable name="task" select="." /> 
     <xsl:for-each select="key('column', id)"> 
      <task> 
       <id><xsl:value-of select="." /></id> 
       <xsl:apply-templates select="$task/*[not(self::id)]" /> 
      </task> 
     </xsl:for-each> 
    </xsl:template> 

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

ありがとう、このメソッドは完全に動作します。 – Jos