2016-03-30 35 views
1

Her xsl için iki ayrı düğümü işlemek istiyorum. Bu benzer görünüyor How do I access elements from the outer loop from within nested loops? soru. Denedim ama değişken kullandıktan sonra bile işe yaramadı. Neyi yanlış yaptığımı bilmiyorum.Her xsl için işlem iki

<?xml version="1.0" encoding="UTF-8"?> 
<demos> 
    <Demo> 
     <productID id="A"/> 
     <price newVal="10" origVal="20"/> 
    </Demo> 
    <Demo> 
     <productID id="B"/> 
     <price newVal="15" origVal="25"/> 
    </Demo> 
</demos> 

sorun içinde: istediğim çıkışı aşağıdadır şimdiye kadar yapmış

<root> 
    <demomain> 
     <demo> 
      <name>A</name> 
      <price>10</price> 

     </demo> 
     <demo> 
      <name>B</name> 
      <price>15</price> 

     </demo> 
    <demomain> 
    <demomainOrig> 
     <demoOrig> 
      <name>A</name> 
      <price>20</price>   
     </demoOrig> 
     <demoOrig> 
      <name></name> 
      <price>25</price>   
     </demoOrig> 
    </demomainOrig> 
</root> 

Ve xsl

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="/"> 
<demos> 
    <xsl:for-each select="root/demomain/demo"> 
    <xsl:variable name="newNode" select="."/> 
     <Demo> 
      <productID id="{$newNode/name}"/> 
<xsl:for-each select="root/demomainOrig/demoOrig"> 
      <price newVal="{$newNode/price}" origVal="{price}" /> 
    </xsl:for-each> 
     </Demo> 
    </xsl:for-each> 
</demos> 

</xsl:template> 
</xsl:stylesheet> 

edilir: Burada

xml var her biri için iç. İçerden her birini çıkartırsam fiyat etiketini çıktı olarak alırım, hatta gösterilmez. Ve böylece belirli bir öğe için orijinal fiyatı alamıyorum. Lütfen yardım et.

Bu noktada bir demo eleman üzerinde konumlandırılmış

<xsl:for-each select="root/demomainOrig/demoOrig"> 

Advance

cevap

1

sorun bu hat ile teşekkürler ... yani bu alt öğesi arıyor olacak root çağırdı. Ancak, root, tüm belgenin kök öğesidir. Bu tüm demoOrig unsurları seçecektir gibi, bu hala ihtiyacınız oldukça ne olmaz, Ancak ...

<xsl:for-each select="/root/demomainOrig/demoOrig"> 

böyle olmalıdır.

<xsl:for-each select="/root/demomainOrig/demoOrig[name = $newNode/name]"> 

Ben gerçek XML tüm demoOrig elemanları için belirtilen name vardır varsayıyorum bu XSLT

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

<xsl:template match="/"> 
    <demos> 
     <xsl:for-each select="root/demomain/demo"> 
     <xsl:variable name="newNode" select="."/> 
      <Demo> 
       <productID id="{$newNode/name}"/> 
       <xsl:for-each select="/root/demomainOrig/demoOrig[name=$newNode/name]"> 
        <price newVal="{$newNode/price}" origVal="{price}" /> 
       </xsl:for-each> 
      </Demo> 
     </xsl:for-each> 
    </demos> 
</xsl:template> 
</xsl:stylesheet> 

deneyin: Yalnızca aynı isimde birini seçmek istiyorum.

Aslında, muhtemelen sen kayıtları aramak için bir xsl:key kullanarak yararlanabilir,

<price newVal="{$newNode/price}" origVal="{/root/demomainOrig/demoOrig[name=$newNode/name]/price}" /> 

Alternatif sadece tek ifadeye xsl:for-each yerini alabilir. Mevcut düğümün aynı konumu kullanarak karşılık gelen demoOrig düğümleri getirebilir çok

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

<xsl:key name="orig" match="demoOrig" use="name" /> 

<xsl:template match="/"> 
    <demos> 
     <xsl:for-each select="root/demomain/demo"> 
     <xsl:variable name="newNode" select="."/> 
      <Demo> 
       <productID id="{name}"/> 
       <price newVal="{price}" origVal="{key('orig', name)/price}" /> 
      </Demo> 
     </xsl:for-each> 
    </demos> 
</xsl:template> 
</xsl:stylesheet> 
1

Bu XSLT'yi deneyin (sırası aynıdır, ve adı 'bir tanımlayıcı olmadığını varsayarak).

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="/"> 
    <demos> 
    <xsl:for-each select="root/demomain/demo"> 
     <xsl:variable name="position" select="position()" /> 
     <xsl:variable name="demoOrig" select="/root/demomainOrig/demoOrig[position() = $position]" /> 
     <Demo> 
     <productID id="{name}"/> 
     <price newVal="{price}" origVal="{$demoOrig/price}" /> 
     </Demo> 
    </xsl:for-each> 
    </demos> 

    </xsl:template> 
</xsl:stylesheet> 

Bu çıkışlar: pozisyonunu kullanarak

<?xml version="1.0" encoding="UTF-8"?> 
<demos> 
    <Demo> 
     <productID id="A" /> 
     <price origVal="20" newVal="10" /> 
    </Demo> 
    <Demo> 
     <productID id="B" /> 
     <price origVal="25" newVal="15" /> 
    </Demo> 
</demos> 
+0

güvenilir bir çözüm olarak görünmemektedir. –

İlgili konular