2010-09-09 16 views
7

Yalnızca çocuk düğümünü test edebildiğim bir durumdayım, ancak bu alt düğünün büyükannesine etiketleri uygulamak zorundayım.xslt kullanarak bir düğümün büyükbağlığı nasıl seçilir

kullanıyorum denedim:

<xsl:call-template name="grandparent" select="parent::parent::node()"/> 

ve:

<xsl:call-template name="grandparent" select="ancestor::node [@nameofgrandparentnode]"/> 

Ama ne işleri.

Büyükbaba düğümünün düzeyi sabit değil, bu yüzden [@ level = #] değerini kullanamayacağımı düşünüyorum. Nasıl seçileceğine dair herhangi bir fikir çok takdir edilecektir.

DÜZENLEME: -:

xslt select grandparent node depending on an attribute value of its grandchild node

aşağıdan önerileri kullanarak düğümü seçilmesi çalışmış Bu bölüm yeni soru olarak gönderildi. Teşekkürler! Ancak, büyükbaba veya torun düğümünün özniteliği ile de test etmem gerekiyor.

denedim:

<xsl:template name"one" match="grandparentnode"> 
<Tag1> 
    <xsl:apply-templates select="parentNode" /> 
</Tag1> 
</xsl:template> 

<xsl:template name="two" match="grandparentnode[*/*/@grandchildattr='attrValue']"> 
<Tag2> 
    <xsl:apply-templates select="parentNode" /> 
</Tag2> 
</xsl:template> 

Ancak şablonu "iki" her zaman "olarak adlandırılan alır ve" her zaman

eklenir. Öznitelik değeri 'attrValue' değerine eşit olmayan torun düğümleri için bile.

Burada bir şey mi özlüyorum?

+0

İyi soru (+1). "" talimatında kullanabileceğiniz bir dizi XPath ifadesi için cevabımı inceleyin. –

+0

@highlightall Düzenlenen kısım net değil. Lütfen, tam olarak (ancak olabildiğince kısa) XML belgesini ve eksiksiz XSLT stil sayfasını (tekrar mümkün olduğunca kısa) sorununuzu tekrarlayın. Tercihen, bunu yeni bir soruyla sorun. –

+0

@highlightall: Ayrıca, '' attrValue '' öznitelik değerine eşit olmayan torun düğümleri için bile bu desenle doğru olamaz. Grandparentnode [*/*/@ grandchildattr = 'attrValue'] ' –

cevap

17

kullanıyorum denedim:

<xsl:call-template name="grandparent" select="parent::parent::node()"/> 

ve:

<xsl:call-template name="grandparent" select="ancestor::node[@nameofgrandparentnode]"/> 

Ama ne işleri.

Kesinlikle "iş" <xsl:call-template> talimat bir select özelliği olmayan olmaz çünkü!

Bunu, <xsl:call-template> öğretim <xsl:with-param> çocukları kullanarak parametre aktarmak mümkündür:

<xsl:call-template name="compute"> 
    <xsl:param name="pAncestor" select="someExpression"/> 
</xsl:call-template> 

<xsl:with-param> Kullanım ait select özellik için:

../.. 
: Gerçek bir büyükbaba için

En yakın ata elemanı için

someName isim: değişken $ancName içerdiği adıyla yakın atası elemanı için

ancestor::someName[1] 

:

ancestor::*[name()=$ancName][1] 
+0

+1 kısaltması için XPath ifadesi. –

+0

çalıştı - teşekkürler! – highlightall

+0

@highlightall: Çalıştığına sevindim. Burada SO'ya bir cevap kabul ederek şükran ifade edilir. İpucu: Sadece cevabın yanındaki onay işaretini tıklayın. :) –

4

Ben bir durumda kendimi nerede can çocuk düğüm için sadece bir test, ama ben Bu çocuk düğümünün büyükannesine etiketler uygulamak zorunda.

XSLT prosedürel bir programlama değildir, bu yüzden bazı şeyleri biraz farklı düşünmeniz gerekir.

Doğru anlıyorsam, XML'inize yeni etiketler (ek alt öğeler veya öznitelikler?) Enjekte etmek istersiniz, ancak belirli bir alt öğe bulduğunuzda onu bir ataya eklemek istersiniz. Örnek kodunuz, çocuğa rastladığınızda büyük ebeveynleri hedeflemeye çalışmaktadır. Ne yazık ki, bu çok geç olabilir.

o koşula uyan çocuk rastlar (veya başka zaman

Sen motoru (sizin durumunuzda büyükbaba) değiştirmek istediğiniz öğenin genelinde geldiğinde yeni element/özellik enjekte gerekebilir, değil mi olacak öğelerin eklenmesi sonunda veya

Consider this input (büyükbaba = "albüm", torun = "etiket")) çocuğa niteliklerini: belirli birolup olmadığına bağlı album değiştirmek istediğiniz

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

<album> 
    <title>Sgt. Pepper's Lonely Hearts Club Band</title> 
    <artist>The Beatles</artist> 
    <year>1967</year> 
    <labels> 
    <label>Parlophone</label> 
    <label>Capitol</label> 
    </labels> 
</album> 
mevcut. Hedefleme düğümleri için genel biçimin şu olduğunu unutmayın: target-node[target-condition].Bir Capitol etiket torun öğesi herhangi album elemanlarını değiştirmek için, bunu kullanmaktan ediyorum:

album[*/label='Capitol'] 

Yani benim koşulla eşleşen album 's yeni bir özellik ve 2 yeni alt öğelerini eklemek için bu stil düşünün:

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

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

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

    <xsl:template match="album[*/label='Capitol']"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:attribute name="new-attribute">A Capitol Record</xsl:attribute> 
     <new-element1/> 
     <xsl:apply-templates select="node()"/> 
     <new-element2/> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

Çıktı (el biçimlendirilmiş):

<?xml version="1.0" encoding="UTF-8"?> 
<album new-attribute="A Capitol Record"> 
    <new-element1/> 
    <title>Sgt. Pepper's Lonely Hearts Club Band</title> 
    <artist>The Beatles</artist> 
    <year>1967</year> 
    <labels> 
    <label>Parlophone</label> 
    <label>Capitol</label> 
    </labels> 
    <new-element2/> 
</album> 

Bazı korumalı alan deneme kaynakları:ne görmek için

+1

Doğru yanıt hakkında iyi bir cevap ve açıklama için @Bert F: +1. –

+0

@Alejandro - Teşekkürler - bu test kaynaklarına bir göz atın - Onları deney için son derece uygun ve yararlı buluyorum. –

+1

Çok kullanışlı kod örneği. Teşekkürler! – highlightall

İlgili konular