2

次のような入力 XML ドキュメントがあるとします。

<?xml version="1.0" encoding="utf-8"?>
<title> This contains an 'embedded' HTML document </title>
<document>
<html>
<head><title>HTML DOC</title></head>
<body>
Hello World
</body>
</html>
</document>
</root>

その「内部」HTMLドキュメントを抽出する方法; それを CDATA としてレンダリングし、出力ドキュメントに含めますか?

したがって、出力ドキュメントは HTML ドキュメントになります。これには、要素をテキストとして表示するテキストボックスが含まれています(したがって、内部ドキュメントの「ソースビュー」が表示されます)。

私はこれを試しました:

<xsl:template match="document">
<xsl:value-of select="*"/>
</xsl:template>

ただし、これはテキスト ノードのみをレンダリングします。

私はこれを試しました:

<xsl:template match="document">
<![CDATA[
<xsl:value-of select="*"/>
]]>
</xsl:template>

しかし、これは実際の XSLT をエスケープし、次のようになります。

&lt;xsl:value-of select="*"/&gt;

私はこれを試しました:

<xsl:output method="xml" indent="yes" cdata-section-elements="document"/>
[...]
<xsl:template match="document">
<document>
<xsl:value-of select="*"/>
</document>
</xsl:template>

これにより CDATA セクションが挿入されますが、出力にはテキストのみが含まれます (削除された要素):

<?xml version="1.0" encoding="UTF-8"?>
<html>
   <head>
      <title>My doc</title>
   </head>
   <body>
      <h1>Title: This contains an 'embedded' HTML document </h1>
      <document><![CDATA[
                                                HTML DOC

                                                                Hello World

                                ]]></document>
   </body>
</html>
4

1 に答える 1

11

ここで解決しなければならない 2 つの混乱があります。

xsl:copy-ofまず、おそらくxsl:value-of. 後者は要素の文字列値を返し、前者は要素のコピーを返します。

第 2 に、cdata-section-elementson 属性xsl:outputはテキスト ノードのシリアル化に影響しますが、要素と属性のシリアル化には影響しません。必要なものを取得する 1 つの方法は、次の行に沿って HTML を自分でシリアル化することです (テストされていません)。

<xsl:template match="document/descendant::*">
  <xsl:value-of select="concat('&lt;', name())"/>
  <!--* attributes are left as an exercise for the reader ... *-->
  <xsl:text>&gt;</xsl:text>
  <xsl:apply-templates/>
  <xsl:value-of select="concat('&lt;/', name(), '>')"/>
</xsl:template>

しかし、より迅速な方法は、友人のTommie Usdinから指摘された次の解決策のようなものです(きしむ読者は今すぐ読むのをやめてください)。cdata-section-elementsから属性を削除し、要素xsl:outputのテンプレートを次のように置き換えます。document

<xsl:template match="document">
  <document>
    <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
    <xsl:copy-of select="./html"/>
    <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
  </document>
</xsl:template> 
于 2012-09-12T23:01:05.290 に答える