2016-04-04 15 views
0

グッドモーニング、xslを使用してXMLノードからCDATAを取得し、新しいXMLで変換する方法は?

は私がXMLコンテンツCDATAコードに問題があります。私たちは、このXMLがある場合:

<?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> 

を我々はこれを持っている必要があります:XSLTはどこ

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

のですか?私は、XMLファイル内のCDATAコンテンツのみを抽出し、残りを削除したいと思います。私はXSLT 1.0を使用します。

ありがとうございました!

答えて

0

出力方法がtextに設定された変換を使用して、name要素からテキストノードを抽出することができます。

<?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> 

つ以上のnameがあなたの入力であります場合は、ルート要素のいくつかの並べ替えを作成する必要があるだろうと、複数のCDATAセクションが要素であるかどうこれが失敗することに注意してください。あなたのCDATAセクションにも先行する空白がありますので、出力をトリムすることをお勧めします。 XSLT自体でそれを行う方法の1つは、関数normalize-space()を使うことですが、CDATA "xml"の内容にも影響します。このメソッドにはXMLプロローグもありません。したがって、出力が有効なXMLとして見なされるのは、それをどのようなものにするかによって異なります。

しかし、これは始めるのに適しています。これは、生成する

+0

ありがとうございます.G_Hですが、出力方法としてXMLが必要です。このソリューションは、私にとっては有効ではありません:(私が必要:?。。<のxsl:出力メソッド=「XML」を/>それはテンプレートで2.0を言いますが、 –

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> 

出力:

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

こんにちはBaderousを、この解決策は、XSLT 2.0のためである私は、XSLT 1.0のおかげ –

+0

必要があります、それだけで1.0の機能を使用していますので、それは後方互換性だ。私は私のサンプルXMLをedittedいる – Baderous

+0

...あなたは申し訳ありませんが?それを確認し、非常にあなたに感謝することができます。 –

0

使用(サクソン9.7またはExseltによって支持されるように)きれいな解決策は、XSLT 3.0で可能である

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

https://www.w3.org/TR/xpath-functions-30/#func-parse-xml-fragmentを参照してください。

+0

申し訳ありませんが、XSLT 1.0を使用していることを忘れてしまいました。ありがとう –

関連する問題