1

我有一个 XML 文件,所有包含信息的节点都在 CDATA 中。这些信息可能使用一些 HTML 标记进行格式化,如下所示:

<EventList>
    <Text><![CDATA[<p>Some text <i>is</i> formatted! This is a character entity &#39;</p>]]></Text>
    <ShortText><![CDATA[Some other is only plain]]></ShortText>
    <!-- others more -->
</EventList>

我想在 (X)HTML 页面中使用 XSLT 对其进行转换:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
<xsl:output 
  method="html" 
  doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
  media-type="application/xhtml+xml" 
  encoding="utf-8" 
  omit-xml-declaration="yes" 
  indent="no"
/>
  <xsl:template match="Text">
    <h2><xsl:copy-of select="text()"/></h2>
  </xsl:template>

  <xsl:template match="ShortText">
    <div><xsl:copy-of select="."/></div>
  </xsl:template>
</xsl:stylesheet>

但是应用这种转换会产生一种奇怪的行为。我在 XSLT 中放入的 HTML 标记已从浏览器中正确解析和解释,但 CDATA 中的标记被去除和char,从而产生以下输出<>&

<h2>pSome text iis/i formatted!  This is a character entity #39;/p</h2>
<div>Some other is only plain</div>

起初它看起来像是<xsl:output>定义中的一个问题,但我仍然坚持这一点。我尝试使用速记 XPath.和函数text(),但输出是相同的。任何建议表示赞赏!

4

1 回答 1

2

您的 XML 表示 Text 元素的内容是其中没有标记的字符串,其中恰好包含许多 XML 分隔符,例如左尖括号和 & 符号。您的样式表说将该字符串写为字符串,不带标记,因此符合标准的 HTML 处理器会这样做,产生类似的输出

<H2 xmlns="http://www.w3.org/1999/xhtml"
  >&lt;p&gt;Some text &lt;i&gt;is&lt;/i&gt; formatted! 
  This is a character entity &amp;#39;&lt;/p&gt;</h2>
<div xmlns="http://www.w3.org/1999/xhtml"
  ><ShortText xmlns="">Some other is only plain</ShortText></div>

我引入了换行符以使行更短。这不是您作为输出显示的内容,这本身就是暗示性的。

获得更好结果的最简单方法是让您的 XML 开始说出有关数据的真相:如果您希望 Text 元素包含一些 HTML 元素,例如 p 和 i,那么就这样做,然后对其使用身份转换您的数据的一部分。

如果此 XML 的损坏设计是您遇到的问题,那么您可以通过使用disable-output-escapingxsl:value-of 元素上的属性来解决损坏问题。(警告:需要使用 disable-output-escaping 几乎总是表明设计中有问题。)此版本的 Text 模板生成输出,其中输入的字符串数据作为 XHTML 标记写出:

<xsl:template match="Text">
  <h2><xsl:value-of select="string(.)" 
                    disable-output-escaping="yes"/></h2>
</xsl:template>
于 2012-10-11T16:17:21.803 回答