Xslt 生成一些带有 CDATA 的 <name> 标记和一些不带 CDATA 的 <name> 标记?

标签 xslt cdata moodle

摘要:我正在使用 xslt 来转换数据,并且需要生成一些包含 CDATA 的标签和一些不包含 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 ,这似乎表明我有 2 个选择:

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

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

方法 2 添加 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?

最佳答案

我在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>

关于Xslt 生成一些带有 CDATA 的 <name> 标记和一些不带 CDATA 的 <name> 标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3605062/

相关文章:

xslt - 选择所有没有带有2个特定属性的子元素的元素

xml - XSLT:如何从变量中的某个元素获取值?

java - 如何在XSL链中保留原始文档的systemId?

java - 无法使用 CDATA 找到 Suite CRM 的自定义模块

xml - 将包括 CDATA 在内的整个 XML 文件编码到 Soap Envelope 中

python - 通过 Python 的请求库访问 Moodle 服务器的 API

moodle - 如何在 Moodle 中将 block 添加到页面的中心?

xslt - wix 快捷方式 xsl 文件

PHP、SimpleXML、解码 CDATA 中的实体

php - 如何在 Moodle 中使用用户 ID 找到用户角色