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

时间:2010-08-30 23:44:45

标签: xslt cdata moodle

总结:我正在使用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文件中的数据):

方法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>

得到......

方法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"在代码
  3. 中自动生成cdata部分
  4. 使用disable-output-escaping="yes"
  5. 手动生成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?

3 个答案:

答案 0 :(得分: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>

<强>输出

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

正如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>