【问题标题】:Embedding static CDATA with its tag in XSLT在 XSLT 中嵌入带有其标记的静态 CDATA
【发布时间】:2011-04-15 15:07:56
【问题描述】:

我需要从 XSL 中输出嵌入在 XSL 中的静态 CDATA 构造,而不是从我正在转换的 XML 中输出。比如……

<?xml version="1.0"?> 
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">
  <xsl:output method="xml" indent="yes"/>
<!-- ================================================== -->
  <xsl:template match="/">
    <Document>
      <text><![CDATA[
<b>static</b>
<br/><br/>
text
<br/><br/>
      ]]>
      </text>
      <xsl:apply-templates select="//tag"/>
    </Document>
  </xsl:template>
<!-- ================================================== -->
  <xsl:template match="tag">
    So on and so forth...
  </xsl:template>
<!-- ================================================== -->
</xsl:stylesheet>

我想要这个输出...

<?xml version="1.0"?> 
<Document>
  <text><![CDATA[
<b>static</b>
<br/><br/>
text
<br/><br/>
  ]]>
  </text>
  So on and so forth...
</Document>

但我得到的是……

<?xml version="1.0"?> 
<Document>
  <text>
&lt;b&gt;static&lt;/b&gt;
&lt;br/&gt;&lt;br/&gt;
text
&lt;br/&gt;&lt;br/&gt;
  </text>
  So on and so forth...
</Document>

我尝试了几种转义文本和实体的组合,但似乎都不起作用。

【问题讨论】:

    标签: xslt cdata


    【解决方案1】:

    使用

    <xsl:output cdata-section-elements="text" />
    

    对某些元素强制执行 CDATA (spec)。

    在任何情况下,您当前获得的内容相当于 CDATA 部分,它不应该打扰您。 (即:如果它因为光学原因困扰您,那就克服它。如果它因为技术原因困扰您,请修复它们。)

    【讨论】:

    • 这不会改变输出。
    • 1) 文本元素位于 XSL 而不是 XML 中,因此 cdata-section-elements 无效。
    • xsl:output cdata-section-elements 告诉处理器结果树中的哪些元素要以 CDATA 部分作为内容进行序列化,这样才能工作。当我运行添加了 Tomalak 建议 (&lt;xsl:output method="xml" indent="yes" cdata-section-elements="text"/&gt;) 的示例样式表时,它会输出一个 CDATA 部分作为 text 元素的内容。从命令行使用 Saxon 9.3 进行测试。
    • @dacracot “您的陈述“如果由于技术原因而困扰您,请修复它们。”这很烦人” 好吧,很抱歉我的回答让您烦恼。并不是说它不包含任何有用的东西。如果某些应用程序无法处理 XML(显然,这里就是这种情况),那么修复它可能是个好主意。这就是我要表达的观点。
    • 如果 XSLT 处理器正在执行序列化,cdata-section-elements 应该具有预期的效果。然而,从 XSLT 控制序列化总是不稳定的,因为调用应用程序(例如 Oxygen)可能想要控制序列化本身。不幸的是,您正在制定的规范是一个糟糕的规范:强制要求某些内容应该在 CDATA 部分中是错误的,因为共识是 CDATA 只是一种输入便利,而不是像在属性周围选择单引号或双引号,而不是一种携带重要信息的方式。
    猜你喜欢
    • 2011-04-06
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    相关资源
    最近更新 更多