2010-11-18 13 views
0

Zaten işlenmiş düğümlerin işlenmesini önlemek için bir yol var mı?Zaten işlenmiş düğümlerin işlenmesini atla

Girdi XML

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <node1>node1.1</node1> 
    <node2>node2.1</node2> 
    <node2>node2.2</node2> 
    <node1>node1.2</node1> 
</root> 

XSL Gördüğünüz gibi

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

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

    <xsl:template match="node1"> 
     [Node1]:<xsl:value-of select="."></xsl:value-of> 
     <xsl:apply-templates select="following-sibling::node2"/> 
     [End node1] 
    </xsl:template> 

    <xsl:template match="node2"> 
      [Node2]:<xsl:value-of select="."></xsl:value-of> 
    </xsl:template> 

</xsl:stylesheet> 

Çıktı

<?xml version="1.0" encoding="UTF-8"?> 

     [Node1]:node1.1 
      [Node2]:node2.1 
      [Node2]:node2.2 
     [End node1] 

      [Node2]:node2.1 

      [Node2]:node2.2 

     [Node1]:node1.2 
     [End node1] 

şablonHer bir düğüm 2 elemanı için iki kezuygulanmıştır. Düğüm1 şablonundan bir kez ve XSLT işlemci düğüm 2 öğesini dönüştürdüğünde ikinci kez uygulanır.

xsl:template match="node2" ikinci kez uygulanmasını önlemek için herhangi bir çözüm var mı? Düğüm2'nin işlenmesini durdurulamıyorum.

Önemli Bu örnek yalnızca daha karmaşık kullanım durumunun bir öykünmesidir. Bu, ek kısıtlamalarımız olduğu anlamına gelir - kök öğe işleme için şablonu değiştiremeyiz.

Öğelerin işlenmesini durdurmanın veya başka öğelere işlemeyi gerçekleştirmenin herhangi bir yolu olup olmadığını bilmek istiyorum.

+0

ne zaman * * 'node2' şablon uygulanmalıdır? Sadece "node1" öğelerinden önce oluşan "node2" elemanlarına mı? – AakashM

cevap

3

Kullanılacak şablonu adlandırmak için mode kullanabilirsiniz.

select numaralı apply-templates numaralı çağrıya dikkat çekerek, hiçbir şey çıkarmayacak boş bir yakalama düğümü oluşturabilirsiniz. neye ihtiyacınız

aşağıdaki stil çıkışları:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

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

    <xsl:template match="node1"> 
     [Node1]:<xsl:value-of select="."></xsl:value-of> 
     <xsl:apply-templates select="following-sibling::node2" mode="fromNode1"/> 
     [End node1] 
    </xsl:template> 

    <xsl:template match="node2" mode="fromNode1"> 
      [Node2]:<xsl:value-of select="."></xsl:value-of> 
    </xsl:template> 

    <xsl:template match="node2"></xsl:template> 
</xsl:stylesheet> 

Not sonunda boş modsuz şablon ve şablona eklenmiş mode nitelik ve apply-templates arayarak.

+0

Ooh Mod güçlü bir çözüm düşünmemiştim. İyi bir çözüm için – annakata

+0

+1. –

+0

Bunun, 'node1' öncesindeki gruplandırma olmadığını unutmayın. Yani, bir 'düğüm2' iyi bir çözüm için en sonunda bir kez daha –

0

XSLT, her bir uygulama şablonunu (her biri için) izleyemez, potansiyel olarak "gereksiz" sonuçlar üretir, ancak bu, stil sayfasının tasarımında tamamen bir sorundur - eğer istemiyorsanız Bir düğümü bir kereden fazla "işlemek" için uygun şablonları değiştirip seçmeli ve böylece birden fazla kez ele alınmaz.

Örneğiniz için bu oldukça önemsiz olurdu, ancak örneğinizin çok temsili olmadığını söylediniz, bu yüzden sorun yaşıyorsanız daha eksiksiz bir şey göndermenizi öneririz.

1

Bu stil:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="text"/> 
    <xsl:key name="kNode2ByPrecedingNode1" match="node2" 
      use="generate-id(preceding-sibling::node1)"/> 
    <xsl:template match="root"> 
     <xsl:apply-templates select="node1"/> 
    </xsl:template> 
    <xsl:template match="node1"> 
     <xsl:value-of select="concat('[Node1]: ',.,'&#xA;')"/> 
     <xsl:apply-templates select="key('kNode2ByPrecedingNode1', 
             generate-id())"/> 
     <xsl:text>[End node1]&#xA;</xsl:text> 
    </xsl:template> 
    <xsl:template match="node2"> 
     <xsl:value-of select="concat('&#x9;[Node2]: ',.,'&#xA;')"/> 
    </xsl:template> 
</xsl:stylesheet> 

Çıktı:

[Node1]: node1.1 
    [Node2]: node2.1 
    [Node2]: node2.2 
[End node1] 
[Node1]: node1.2 
[End node1] 

Not: İki sorunlar: Eğer tüm düğüm çocuklar için şablonlar uygulamada yaşadığı root kuraldan, birden node2 daha işlemek, ve node1 kuralı; artı sizin following-sibling::node2 ifade, node2 bazı node1 aşağıdaki ayırt edemez.

Düzenleme : Eğer root kural şablonları nasıl uygulanacağı değiştiremezsiniz, o zaman süreci için modlarını ihtiyaç ve kapak koyma atlamak istiyoruz:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="text"/> 
    <xsl:key name="kNode2ByPrecedingNode1" match="node2" 
      use="generate-id(preceding-sibling::node1)"/> 
    <xsl:template match="root"> 
     <xsl:apply-templates/> 
    </xsl:template> 
    <xsl:template match="node1"> 
     <xsl:value-of select="concat('[Node1]: ',.,'&#xA;')"/> 
     <xsl:apply-templates select="key('kNode2ByPrecedingNode1', 
             generate-id())" 
          mode="output"/> 
     <xsl:text>[End node1]&#xA;</xsl:text> 
    </xsl:template> 
    <xsl:template match="node2"/> 
    <xsl:template match="node2" mode="output"> 
     <xsl:value-of select="concat('&#x9;[Node2]: ',.,'&#xA;')"/> 
    </xsl:template> 
</xsl:stylesheet> 
+0

+1 işleme olabilir. –