XSD - 如何使一个元素包含 CDATA 标签?

Posted

技术标签:

【中文标题】XSD - 如何使一个元素包含 CDATA 标签?【英文标题】:XSD - how to make one element include CDATA tags? 【发布时间】:2022-01-21 17:01:23 【问题描述】:

根据我的研究,xsd 似乎无法在指定元素中生成 CDATA 标记。我知道这可能是 XSD 规范的一个限制,我可以转移到其他一些工作流程来解决这个问题。

在我们当前的 XSD 工作流程中,问题是我们必须手动添加 CDATA 标记。这个元素是一个 html 块,我们必须对其进行转义。我们的 XSD --> XML 工作流程因此有点混乱,因为我们发现自己需要手动添加 CDATA 标记。

建议的工作流程/解决方案是什么?

(在 VSCode 中,我们从现有的 XSD 手动创建 XML 文件——如果有帮助,我们可以转换为 DTD 或其他模板格式。这不是一个真正的 XSD 问题[除非你有关于 XSD 的新信息。。 .] 这是一个“我们应该如何重新考虑满足我们需求的方法”的问题。)

【问题讨论】:

这能回答你的问题吗? How do i designate in XSD that an element only contains CDATA? @xerx593 谢谢!这没有帮助。我很好地改变了我们的工作流程或方法,甚至转储 XSD 以支持其他东西,但我需要一种方法来删除我们工作流程中的“人类必须记住过去的标签”部分...... @xerx593 OP 增强 【参考方案1】:

正如其他人指出的那样,在 XSDXML DTDs 中无法要求将元素内容解析为 CDATA,或推断(而不是单独编写)CDATA元素内容周围的部分标记。值得一提的是,另一方面,SGML DTD do 允许元素声明内容 CDATA(或 RCDATA),这使得 SGML 将相应的内容视为未解析的字符数据,即忽略标记分隔符,如 < 和(对于 CDATA 但不是 RCDATA)实体引用起始字符 &。有 CDATA 声明的内容可用是解析 HTML 所必需的,例如。内联 CSS 或包含否则会被解释为标记分隔符的字符的脚本。

指出这一点是因为您声明的目标是包含逐字 HTML,这在使用 XML 时不起作用,因为 HTML 使用 SGML 的 XML 子集中不可用的功能,例如标记省略、空元素和属性缩写等.

【讨论】:

谢谢。我在这里发布了相关问题:***.com/q/70425923/147637【参考方案2】:

XSD 中的设计假设是 CDATA 标记没有信息内容:写 <a><![CDATA[Tate & Lyle]]></a> 完全等同于写 <a>Tate & Lyle</a>,并且任何应用程序都不应该要求您优先写其中一种形式。所以 XSD 试图通过不区分它们来鼓励良好的实践。如果您想通过做出这样的区分来忽略(这种想法)良好实践,那么 XSD 在设计上不会为您提供帮助。

【讨论】:

【参考方案3】:

这里有一个解决方案。只需使用遵循所谓的 Identity Transform 模式的 XSLT 转换。

最重要的 XSLT 允许指定需要 CData 部分的 XML 元素。

cdata-section-elements 属性允许定义以空格分隔的 XML 元素名称列表。这些元素中的每一个都作为目标文档中的 CDATA 部分输出。

在下面查看。 XSLT 指定 <title> 元素值需要一个 CData 部分。

在此处记录:http://www.w3.org/TR/xslt20/#serialization

XSLT

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:g="http://base.google.com/ns/1.0">
   <xsl:output method="xml" indent="yes" cdata-section-elements="title" encoding="utf-8" omit-xml-declaration="no"/>
   <xsl:strip-space elements="*"/>

   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

【讨论】:

谢谢,我想我明白了! VSCode 中有没有办法从该 XSLT 生成一个空 XML? 它是一个通用的样板 XSLT。它将接受任何输入 XML 并为 cdata-section-elements 属性中登记的元素创建一个 CData 部分

以上是关于XSD - 如何使一个元素包含 CDATA 标签?的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis中的CDATA标签

XSD:如何重新定义基本模式的标签

mapper中的CDATA标签的用法

Mybatis中的CDATA标签的用法

雷林鹏分享: XML CDATA

xml元素类型PCDATA和CDATA的区别(DTD中)