2016-04-04 23 views
0

Bir XML dosyasını XSLT 1.0 ile dönüştürmeye çalışıyorum ama bununla ilgili sorun yaşıyorum.XSLT 1.0 dönüşümü

Girdi:

<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> 

Aranıyor sonuç: Her task_order öğesi için

: 1'den fazla rekor eleman (SPLIT4 ve SPLIT4_1) olduğunda ben görev elemanını çoğaltmak gerekir ve orjinal görev kimliğini, kayıt öğelerinden gelen kimlikle değiştirin.

<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> 

Herhangi bir öneriniz var mı?

+0

ben ulaşmak istediğiniz şeyin mantığını alamadım deneyin her

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

için yeni task öğesi oluşturun. Sonuçta ' '/' 'ile nasıl eşlenirsiniz? Neden, ilk 'öğesinde, * SPLIT4_0 * * SPLIT_4 * olarak değiştirildi mi? – potame

+0

İyi ... Görev öğesinin (SPLIT4) teslim edildiği bir arabirimdir, ancak diğer uygulamada, arabirim değerleriyle güncellenmesi gereken 2 görev (SPLIT4_0 ve SPLIT_1) vardır. – Jos

+0

Son bildiriminiz yanımda bir hata oldu – Jos

cevap

0

İlk,

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

Sonraki biraz daha kolay sütunları ararken yapmak için mevcut tüm düğümler arasında kopyalama idare edecek Kimlik Şablon ile başlamak bir xsl:key

kullanmayı düşünün teşekkür ederiz
<xsl:key name="column" match="column" use="substring-before(., '_')" /> 

Ardından, eşleşen tüm column elemenini arayabileceğiniz task ile eşleşen bir şablonunuz var ts anahtarı kullanmak ve bu 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

Teşekkür ederim, bu yöntem mükemmel çalışıyor. – Jos