我通常如何允许非文本元素包含空格“文本”?

Posted

技术标签:

【中文标题】我通常如何允许非文本元素包含空格“文本”?【英文标题】:How do I generally allow non-text elements to contain whitespace "text"? 【发布时间】:2021-12-11 23:34:06 【问题描述】:

与In XSD I want to specify that an element can only have whitespace content 和In XSD how do I allow only whitespace in an element's content? 相关,我有已为其创建XSD 文件的XML 数据文件。在生成 XSD 文件并针对输入进行测试后,我发现传入的数据文件通常具有如下模式,其中包含不带文本的元素:

<source
  id="UGCStrain"
  name="The Strain Complex"
  abbrev="The Strain">
</source>

目前,我的 XSD 有很多元素,如下所示,它们具有属性,有时还有子元素,但不使用嵌入文本:

<xs:element name="source">
  <xs:complexType>
    <xs:attribute name="id" use="required" type="uniqueID"/>
    <xs:attribute name="name" use="required" type="xs:string"/>
    <xs:attribute name="abbrev" type="xs:string" default=""/>
    <xs:attribute name="description" type="xs:string" default=""/>
  </xs:complexType>
</xs:element>

其他人有我想要保留的文本(在某些情况下,这是必需的)。例如,需要添加表示某些标记元素的表达式:

<enmasse
   stage="init">
  component.Skill
</enmasse>

带有相应的 XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

  <xs:element name="autotag">
    <xs:complexType>
      <xs:attribute name="group" use="required"/>
      <xs:attribute name="tag" use="required"/>
    </xs:complexType>
  </xs:element>
  
  <xs:element name="enmasse">
    <xs:complexType mixed="true">
      <xs:sequence minOccurs="0">
        <xs:element maxOccurs="1" ref="autotag"/>
      </xs:sequence>
      <xs:attribute name="stage" use="required"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

根据这两个链接的问题,可以创建一个只允许空白文本而不会引发错误的类型,但它要求每个这样的元素都被赋予该类型。有没有办法让它适用于每个元素,如果它是一个没有'mixed =“true”'的复杂类型,它允许空白“文本”?

如果相关,我正在使用 Python xmlschema 库进行 XSD 验证。

【问题讨论】:

您需要更具体地了解要求。你真的是说没有mixed=true的any复杂类型应该被这样对待吗?或者您是否想到了复杂类型的特定模式(可能没有任何子标签)?您提供了一些示例,但我没有看到任何这种“可忽略”空格的示例。 re: '但它要求每个这样的元素都被赋予那种类型'......你的评论到底是什么意思?您是否正在寻找某种方法来避免为输入 XML 中的每个标签创建元素声明? @kimbert:没错。我希望将只有空格的元素视为空元素,而不必为每个元素定义显式处理它。空白对于没有空白的项目很重要,所以我认为我不能使用选项来消除它。我想如果它只是用于 XSD 评估它会起作用,但在与其他人共享它时也会变得尴尬(数据格式的创建者从未提供过 XSD 模式,尽管格式已记录)。 【参考方案1】:

您的要求似乎是

a) 如果标签包含 only 空格,则将空格折叠为空字符串。

b) 如果标签包含空格和非空格字符的混合,不要抑制任何空格。

c) 自动为每个具有纯文本值的标记执行 a) 和 b),无论该标记是否在 XSD 中声明

可以在 XSD 中的简单类型上使用 xs:whiteSpace facets 来实现规则 a) 和 b)。 规则 c) 是不可能的,因为 XML 模式仅适用于在 XSD 中具有元素声明的标签。您可以容忍使用 xs:any 的未声明标签,但 XML Schema 不会对其内容应用任何规则。

我认为您应该使用 XSLT 预处理您的 XML 并将规则 a) 应用于仅空白标记。然后您可以继续使用 XML Schema 来解析和验证预处理的 XML。

【讨论】:

以上是关于我通常如何允许非文本元素包含空格“文本”?的主要内容,如果未能解决你的问题,请参考以下文章

如何为非 li 元素申请 ngfor?

显示 flex 省略了 span 标签中给出的文本值周围的空格 [重复]

允许在 HTML 5 可拖动子元素上选择文本

如何利用jQuery给匹配的元素添加多个类名

HTML5 文本标记

如何在序列化之前从 DOM 中去除仅包含空格的文本节点?