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】:正如其他人指出的那样,在 XSD 或 XML 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 &amp; 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 标签?的主要内容,如果未能解决你的问题,请参考以下文章