2016-04-04 13 views
0

Günaydınxsl kullanarak xml düğümünden CDATA nasıl alınır ve yeni bir XML'de dönüştürülür?

Bir XML içeriğinin CDATA kodu ile ilgili bir sorun var. Bu XML varsa:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<character> 
    <Body> 
     <methodResult> 
     <nodeOut> 
      <![CDATA[ <film>Indiana Jones and the Kingdom of the Crystal Skull</film>]]> 
     </nodeOut> 
     </methodResult> 
    </Body> 
</character> 

Biz bu olması gerekir: XSLT Nerede

<film>Indiana Jones and the Kingdom of the Crystal Skull</film> 

mı? Bir XML dosyasında sadece CDATA içeriğini ayıklamak ve geri kalanını silmek istiyorum. XSLT 1.0 kullanıyorum.

Teşekkür ederiz!

cevap

0

Çıkış yöntemi text olarak ayarlanmış bir dönüşümü kullanabilir ve name öğesinden metin düğümünü ayıklamanız yeterlidir. elemanda birden CDATA bölümleri varsa bu sizin girişte birden fazla name varsa kök elemanın çeşit oluşturmak gerekir ki başarısız olacağını

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

    <xsl:output method="text" /> 

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

    <xsl:template select="name/text()"> 
     <xsl:value-of select="." /> 
    </xsl:template> 

</xsl:stylesheet> 

Not. Ayrıca, CDATA bölümünüzde lider boşluk var, bu yüzden çıkışı kırpmanızı öneriyorum. Bunu XSLT'de yapmanın bir yolu, normalize-space() işlevini kullanmaktır, ancak CDATA'nın "xml" içeriğini de etkileyecektir. Ayrıca, bu yöntemle XML prolog da yoktur, bu nedenle çıktı geçerli XML olarak göründüğünde, onu beslediğiniz şeye bağlı olarak değişir.

Ancak bu, başlamak için iyi bir yerdir. Bu üretecek

+0

Teşekkürler G_H ama çıkış yöntemi için bir XML'e ihtiyacım var. Bu çözüm benim için geçerli değil :(I need:

1

XML:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="2.0"> 

    <!-- ignore this elements --> 
    <xsl:template match="role|actor|part"/> 

    <!-- get the remaining text and remove white-spaces --> 
    <xsl:template match="text()"> 
     <xsl:value-of select="normalize-space(.)" disable-output-escaping="yes"/> 
    </xsl:template> 

</xsl:stylesheet> 

Çıkış:

<?xml version="1.0" encoding="UTF-8"?><film>Indiana Jones and the Kingdom of the Crystal Skull</film> 
+0

Merhaba Baderous, bu çözüm XSLT 2.0 için mi? XSLT 1.0'a ihtiyacım var. Teşekkürler –

+0

Şablonda 2.0 yazıyor olsa da, sadece 1.0 özellikleri kullandığından geriye doğru uyumludur. – Baderous

+0

Örneklerimi düzenledim xml ... gözden geçirebilir misin? Üzgünüz ve çok teşekkür ederim –

0

kullanılarak (Saxon 9.7 veya Exselt desteklediği gibi) bir temiz çözelti XSLT'de 3.0 mümkündür

<xsl:template match="/"> 
    <xsl:copy-of select="parse-xml-fragment(character/name/text()[last()])"/> 
</xsl:template> 

Bakınız https://www.w3.org/TR/xpath-functions-30/#func-parse-xml-fragment.

+0

Üzgünüm, XSLT 1.0 kullandığımı eklemeyi unuttum. Teşekkürler –

İlgili konular