Xslt生成一些带有CDATA的<name>标签和一些没有的<name>标签?

Wil*_*ard 2 xslt moodle cdata

简介:我正在使用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>
Run Code Online (Sandbox Code Playgroud)

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

方法1,没什么特别的

<?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>
Run Code Online (Sandbox Code Playgroud)

得到了......

方法1的输出错误

<question>
  <name>
    <text>FooName</text>
  </name>
  <questiontext format="html">
    <text>&lt;img src="1.png"&gt;</text>
  </questiontext>
</question>
Run Code Online (Sandbox Code Playgroud)

所以我查看xslt文档一些SO问题,似乎说我有2个选项:

  1. 什么都不做,CDATA逃脱了.
  2. 用于cdata-section-elements ="text"在标记内自动生成cdata部分
  3. 使用,手动生成CDATA部分 disable-output-escaping="yes"

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

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

<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" cdata-section-elements="text"/>
Run Code Online (Sandbox Code Playgroud)

输出错误cdata-section-elements ="text":

<question>
  <name>
    <text><![CDATA[FooName]]></text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<img src="1.png">]]></text>
  </questiontext>
</question>
Run Code Online (Sandbox Code Playgroud)

所以2不是一个选项,因为在我无法控制的模式中,我不希望包含其他元素包含CDATA.

这让我有了选项3,手动逃避它.我的问题是:选项3是我唯一的选择吗?我还能做些什么来使用XSLT获得我想要的输出?不使用XSLT?

小智 5

我在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>
Run Code Online (Sandbox Code Playgroud)

产量

<no1><![CDATA[xxxxxxxxxxxx]]></no1>
Run Code Online (Sandbox Code Playgroud)