Xslt 产生一些;带有 CDATA 和一些的标签标签没有?

发布于 2024-09-16 10:53:19 字数 2744 浏览 5 评论 0原文

摘要:我正在使用xslt 来转换数据,并且需要生成一些内部带有CDATA 的标签和一些不带有CDATA 的标签。转义 CDATA 部分是我唯一的选择吗?

我正在尝试将 xml 中已有的数据转换为 Moodle Xml 进行导入。最终产品需要包含一些 Html,Moodle Xml 文档明确指出需要包含这些 Html在 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 文档一些 SO 问题,这似乎说我有两个选择:

  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"输出错误code>:

<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?

Summary: I'm using xslt to convert data, and need to produce some tags with CDATA inside and some tags without. Is escaping the CDATA sections my only option?

I'm attempting to convert data I already have in xml to Moodle Xml for importing. The final product needs to include some Html, which the Moodle Xml doc specifically says needs to be contained in CDATA.

Desired Output:

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

I gave this a try using the following code (trimmed down, but will include the data from my input xml file):

Method 1, nothing special

<?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>

And got...

Bad Output from Method 1

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

So I look up the xslt documentation and some SO questions, which seem to say I have 2 options:

  1. Do nothing, CDATA gets escaped.
  2. use cdata-section-elements ="text" to auto-generate cdata sections inside tags
  3. Generate CDATA sections by hand, using disable-output-escaping="yes"

Ok, autogeneration sounds good. Lets try that:

Method 2 adding cdata-section-elements="text"

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

Bad Output from cdata-section-elements ="text":

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

So 2 isn't an option because there are other elements I do NOT want containing CDATA, in a schema I don't control.

This leaves me with option 3, escaping it by hand. My question then is: Is option 3 my only option? Is there anything else I can do to get my desired output using XSLT? not using XSLT?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

残花月 2024-09-23 10:53:19

我在 http://neehouse.com/code/xslt/cdata_string_output.aspx< 上找到了此方法/a>

代码

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

输出

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

I've found this method on http://neehouse.com/code/xslt/cdata_string_output.aspx

Code

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

Output

<no1><![CDATA[xxxxxxxxxxxx]]></no1>
若相惜即相离 2024-09-23 10:53:19

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

由于对输出词法外观的要求极其奇怪且罕见,因此您只剩下第三种方法。

As you have noticed, your Method 1 and Method 2 do not produced the result you want.

Because of the extremely strange and rare requirement for the output lexical appearance, you are left with only the 3rd method.

や三分注定 2024-09-23 10:53:19

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

As Dimitre has answer, your requirement is strange because in XML elements names have schema meaning. If text elements schema allows CDATA, this is so for all text elements.

One way to do what you want with extra element:

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

Output (with any input):

<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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文