2009-10-01 6 views
7

Aşağıdaki gibi bir belgeyi bir belgeye başka bir belgeye dönüştürmeye çalışıyorum, CDATA'yı ilk belgede olduğu gibi bırakıyorum, ancak nasıl olduğunu anlayamadım. CDATA'yı XSLT ile korumak için.XML'i XSLT ile dönüştürün ve CDATA'yı (Ruby'de) koruyun

İlk XML:

<node> 
    <subNode> 
     <![CDATA[ HI THERE ]]> 
    </subNode> 
    <subNode> 
     <![CDATA[ SOME TEXT ]]> 
    </subNode> 
</node> 

Final XML: Böyle bir şey denedim ama hiçbir şans, her şey karmakarışık olur

<newDoc> 
    <data> 
     <text> 
      <![CDATA[ HI THERE ]]> 
     </text> 
     <text> 
      <![CDATA[ SOME TEXT ]]> 
     </text> 
    </data> 
</newDoc> 

:

<xsl:element name="subNode"> 
    <xsl:value-of select="." disable-output-escaping="yes"/> 
</xsl:element> 

Herhangi fikirleri nasıl CDATA'yı korumak için?

Teşekkürler! Lance

yakut/Nokogiri

Güncelleme kullanılması: Burada işler şey. Ihtiyacım olanı için çalışır CDATA'da, tüm metni() düğümleri kaydırılır ve bu metnin html etiketi koruyacak

<text disable-output-escaping="yes">&lt;![CDATA[</text> 
<value-of select="normalize-space(text())" disable-output-escaping="yes"/> 
<text disable-output-escaping="yes">]]&gt;</text> 

.

cevap

5

Düz metin düğümleriyle karıştırılmışsa, kesin CDATA düğümleri dizisini koruyamazsınız. En iyi ihtimalle, sen xsl:output/@cdata-section-elements bu öğe adı listeleyerek, CDATA olmak çıkışta belirli bir elementin tüm içeriği zorlayabilirsiniz:

<xsl:output cdata-section-elements="text"/> 
+0

xslt'yi ya da bu satırlardaki bir şeyi yapmadan önce ön işleme almak için yakut ve belki de normal ifadeleri kullanmalı mıyım? Bunu başka nasıl yaparsın? Cdata-section-elements onu oldukça kesmiyor çünkü değişkenler kullanıyorum ve böyle. Bahşiş için teşekkürler. –

+0

Kesinlikle CDATA'ya ihtiyacınız varsa, XSLT'den başka bir şey aramanız gerekecek. Yani, ihtiyacın nedenini merak ediyorum. XDM, metin ve CDATA'yı çok iyi bir nedenden dolayı ayırt etmemektedir - akılcı bir XML işleme uygulaması, onlar için farklı anlamlar vermemelidir, bu yüzden CDATA ve karakter kaçışları, birbirinin yerine kullanılabilir olmalıdır. –

+0

Bu veriyi Flash uygulamasında kullanıyorum ve CDATA/CDATA yokken birçok sorun olduğunu duydum. Gerçekten henüz denemedim: p –

3

kendi sorusuna yanıt göndermek için üzgünüm, ama bir şey buldum : ihtiyacım olanı için çalışan tüm metin() CDATA'da düğümleri, kaydırılır ve bu metnin html etiketi koruyacak


<text disable-output-escaping="yes">&lt;![CDATA[</text> <value-of select="normalize-space(text())" disable-output-escaping="yes"/> <text disable-output-escaping="yes">]]&gt;</text> 

.

+0

CDATA düğümünü özellikle çıktıda almanın bir yolu olduğunu düşünüyorum. Tam olarak ne beklediğinizi yapın, ancak giriş CD düğümlerini giriş CDATA düğümlerinden ayırmanın bir yolu olmadığından, bunun ilk olarak orada bulunan CDATA düğümlerini korumanıza nasıl izin vereceğini anlamıyorum. Aksi halde, bunun nasıl “cdata-section-elements” den farklı olduğunu göremiyorum ... –