【问题标题】:Xslt produce some <name> tags with CDATA and some <name> tags without?Xslt 产生一些带有 CDATA 的 <name> 标记和一些没有 CDATA 的 <name> 标记?
【发布时间】:2011-04-06 00:37:04
【问题描述】:

总结:我正在使用xslt来转换数据,需要生成一些里面有CDATA的标签和一些没有的标签。转义 CDATA 部分是我唯一的选择吗?

我正在尝试将 xml 中已有的数据转换为 Moodle Xml 以进行导入。最终产品需要包含一些 Html,Moodle Xml doc 明确表示需要包含在 CDATA 中。

所需的输出:

<question>
  <name>
    <text>FooName</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<img src="1.png">]]></text>
  </questiontext>
</question>

我尝试使用以下代码(精简,但将包含来自我的输入 xml 文件的数据):

方法一,没什么特别的

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

  <xsl:template match="/">
    <question>
      <name>
        <text>FooName</text>
      </name>
      <questiontext format="html">
        <text><![CDATA[<img src="1.png">]]></text>
      </questiontext>
   </xsl:template>

</xsl:stylesheet>

得到了……

方法 1 的错误输出

<question>
  <name>
    <text>FooName</text>
  </name>
  <questiontext format="html">
    <text>&lt;img src="1.png"&gt;</text>
  </questiontext>
</question>

所以我查找了xslt documentationsome SO questions,这似乎说我有两个选择:

  1. 什么都不做,CDATA 被转义。
  2. 使用cdata-section-elements ="text"在标签内自动生成cdata部分
  3. 使用disable-output-escaping="yes"手动生成CDATA部分

好的,自动生成听起来不错。让我们试试吧:

方法二添加cdata-section-elements="text"

<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" cdata-section-elements="text"/>

来自cdata-section-elements ="text"的错误输出

<question>
  <name>
    <text><![CDATA[FooName]]></text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<img src="1.png">]]></text>
  </questiontext>
</question>

所以 2 不是一个选项,因为在我无法控制的架构中,我不想包含 CDATA 的其他元素。

这给我留下了选项 3,手动逃脱。那么我的问题是:选项 3 是我唯一的选择吗?我还能做些什么来使用 XSLT 获得我想要的输出吗?不使用 XSLT?

【问题讨论】:

  • 您是否验证过使用方法 2 (cdata-section-elements="text") 会破坏 Moodle?如果它正确解析 XML,那么“额外”的 CDATA 部分就不会打扰它。实际上,如果它正确解析 XML,那么它也应该处理转义的 HTML。如果这些都不起作用,那么问题出在 Moodle 上,而不是 XML 或 XSLT。

标签: xslt cdata moodle


【解决方案1】:

正如您所注意到的,您的方法 1 和方法 2 没有产生您想要的结果。

由于对输出词法外观的极其奇怪和罕见的要求,你只剩下第三种方法了。

【讨论】:

    【解决方案2】:

    正如 Dimitre 的回答,您的要求很奇怪,因为在 XML 元素中,名称具有架构含义。如果 text 元素架构允许 CDATA,那么对于所有 text 元素都是如此。

    一种用额外元素做你想做的事的方法:

    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xhtml="http://www.w3.org/1999/xhtml">
    <xsl:output cdata-section-elements="xhtml:div"/>
        <xsl:template match="/">
            <question>
                <name>
                    <text>FooName</text>
                </name>
                <questiontext format="html">
                    <text>
                         <xhtml:div><![CDATA[<img src="1.png">]]></xhtml:div>
                    </text>
                </questiontext>
            </question>
        </xsl:template>
    </xsl:stylesheet>
    

    输出(任何输入):

    <question xmlns:xhtml="http://www.w3.org/1999/xhtml">
        <name>
            <text>FooName</text>
        </name>
        <questiontext format="html">
            <text>
                <xhtml:div><![CDATA[<img src="1.png">]]></xhtml:div>
            </text>
        </questiontext>
    </question>
    

    【讨论】:

      【解决方案3】:

      我在http://neehouse.com/code/xslt/cdata_string_output.aspx找到了这个方法

      代码

      <no1>
          <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
          <xsl:value-of select="data/NO1"/>
          <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
      </no1>
      

      输出

      <no1><![CDATA[xxxxxxxxxxxx]]></no1>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-11
        • 2012-08-08
        相关资源
        最近更新 更多