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

您需要在这里澄清两个困惑。

首先,您可能想要xsl:copy-of而不是xsl:value-of. 后者返回元素的字符串值,前者返回元素的副本。

其次,cdata-section-elements属性 onxsl:output影响文本节点的序列化,但不影响元素和属性。获得所需内容的一种方法是自己序列化 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 回答