xslt

2010-06-25 31 views
11

kullanarak belirli bir xml öğesinden özniteliği dışla xslt. Aşağıdaki problemim var. Belirli bir öğeden belirli bir özniteliği (örnekte theAttribute) kaldırmak için bir xml içinde ihtiyacım var (ör. div). yanixslt

<html> 
    <head>...</head> 
    <body> 
     <div id="qaz" theAtribute="44"> 
     </div> 
     <div id ="ddd" theAtribute="4"> 
     <div id= "ggg" theAtribute="9"> 
     </div> 
     </div> 
     <font theAttribute="foo" /> 
    </body> 
</html> 

theAtribute nitelik

<html> 
    <head>...</head> 
    <body> 
     <div id="qaz"> 
     </div> 
     <div id ="ddd"> 
     <div id= "ggg"> 
     </div> 
     </div> 
     <font theAttribute="foo" /> 
    </body> 
</html> 

kaldırılmıştır olmak için. Uygun çözümü bulmaya çalıştığım bu temelde http://www.biglist.com/lists/xsl-list/archives/200404/msg00668.html'u buldum. seçerseniz

yani <xsl:template match="@theAtribute" />

bütün belgeden kaldırmasıyla

... ve diğerleri kibrit gibi, vb Hiçbir şey bu konuda bana yardımcı olur musunuz :-(? benim için önemsiz ses .. çalıştı fakat XSLT'de ile, sadece @theAtribute?

Eğer öyleyse olmadan

? peşin

çalışmıyor ne
+0

, kodu vurgulamak ve düzenleme panelinin üst kısmındaki "010101" düğmesine tıklayın veya metni 4 boşluk girintileyebilirsiniz. –

cevap

22

içinde teşekkür ederiz Eğer aynı içeriği istiyorsunuz ... hiç başa çıkamaz, stil sayfanızın olduğundan emin olun Yalnızca @theAtribute belli bastırmak istiyorsanız

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <!--empty template suppresses this attribute--> 
    <xsl:template match="@theAtribute" /> 
    <!--identity template copies everything forward by default--> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

, o zaman eşleşme ölçütünü daha spesifik hale getirebilir: @theAtribute için boş şablon, aynı zamanda çıkış işe başka her şeyi kopyalar bir kimlik şablonu vardır. Eğer kaldırmak istiyorsanız

<xsl:template match="*[@id='qaz']/@theAtribute" /> 

:

<xsl:template match="@theAtribute[../@id='qaz']" /> 

veya bu şablonu: Yalnızca @id="qaz" var div o niteliği kaldırmak istiyorsa Örneğin, o zaman bu şablonu kullanabilirsiniz @theAttribute, tüm div öğeleri, sonra eşleşme ifadesini aşağıdaki gibi değiştirin:

<xsl:template match="div/@theAtribute" /> 
+0

Merhaba, bu iki de ben de korkmuştum ama korkmuyorum. İlki heryerden "TheAtribute" (divs, body, font, vb.) etiketlerini kaldırır. İkinci yaklaşım, tüm düğümlerden @ theTribute'ın her yerden id = qaz ile kaldırılır. yazmamın bir yolu var mı? İhtiyacım olan bu iki düşüncenin bir karışımı, ama xslt üzerindeki mi cehalet nedeniyle formatı anlayamıyorum. Ben theTribute'ı tüm div'lardan ve sadece div'lardan kaldırmak istiyorum. – Alexandros

+1

Anladım. Özellikle div/@ theAtribute işlevini hariç tutmak istediğiniz açıklamasında farketmedim. Cevabı güncelledim.XML öğeleriniz bir ad alanına bağlıysa, ad alanını XSLT'nizde bildirmeniz veya ad alanını yok sayan ve yerel addaki eşleşmeleri gösteren bir XPATH ifadesi kullanmanız gerekebilir (ör. '* [Local-name() = 'div ']/@ theAtribute' –

+0

Çalıştı !!!! Mükemmel çözüm ve gerçekten hızlı yanıt. Teşekkür ederim Hansen !! – Alexandros

8

select içinde, name işlevini kullanarak niteliği hariç tutabilirsiniz (veya içerebilir). Eğer kod biçimlendirilmiş istiyorsanız Örneğin

, <xsl:copy-of select="@*[name(.)!='theAtribute']|node()" />

+0

Bu benim için iyi çalıştı, ben bir öznitelik değiştirmek ve geri kalanını kopyalamak istedim, ve bu ifade "geri kalan" için iyi çalıştı – davenpcj