【问题标题】:XSD for varying element names用于不同元素名称的 XSD
【发布时间】:2015-06-24 10:45:32
【问题描述】:

我想为 XMl 形成一个 xsd 模式,其元素范围为 z1-zx。是否可以在 xml 模式中定义它而不必写出声明每个元素。

请看下面:

<?xml version="1.0"?>
<Zones>
    <Z1>Asset00</Z1>
    <Z2>Asset00</Z2>
</Zones>

我希望这些区域能够升级到 Zxxx,而不必在 XSD 中声明每一个,是否可以这样做?

请注意,我无法更改 xml 的结构,因为我将它用于另一个只能采用这种格式的软件。

【问题讨论】:

  • 不,你不能这样做。这是一种糟糕的 XML 设计,并且 XSD 的设计目的不是允许验证设计不佳的 XML。不是你的错,因为它不是你设计的,但它就是这样。

标签: xml xsd xsd-validation


【解决方案1】:

XSD 1.0

您可以在 XSD 1.0 中做的最好的事情是允许 Zones 下的任何元素:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Zones">
    <xs:complexType>
      <xs:sequence>
        <xs:any processContents="skip" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
   </xs:element>
</xs:schema>

XSD 1.1

在 XSD 1.1 中,您可以更进一步,将 Zones 的子级名称限制为以 Z 开头:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
  vc:minVersion="1.1">
  <xs:element name="Zones">
    <xs:complexType>
      <xs:sequence>
        <xs:any processContents="skip" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:assert test="every $e in * satisfies starts-with(local-name($e), 'Z')"/>
    </xs:complexType>
   </xs:element>
</xs:schema>

您可以更进一步,要求Z 前缀后面的字符串是一个数字,甚至还可能施加一个排序约束,但这应该会让您指向正确的方向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    相关资源
    最近更新 更多