定义具有唯一属性的可重用类型

问题描述 投票:0回答:1

我想创建一个模式,需要在给定元素内:

  • 给定的子元素必须至少出现一次
  • 如果给定的子元素出现多次,则每次出现都必须使用不同的命名属性

上述限制应适用于多个子元素,我只想声明此限制一次(即:DRY)

实际上,这实际上是为子元素提供翻译,例如在下面的示例中,

title
firstline
元素都应该至少出现一次,但对于每种给定语言仅出现一次:

<book>
  <title lang="en">The Hobbit</title>
  <title lang="de">Der kleine Hobbit</title>
  <firstline lang="en">In a hole in the ground there lived a hobbit.</firstline>
  <firstline lang="fr">Dans un trou vivait un hobbit</firstline>
</book>

然而这应该是非法的,因为

<title lang="en">
元素是重复的:

<book>
  <title lang="en">The Hobbit</title>
  <title lang="en">The Hobbit or There and Back Again</title>
  <firstline lang="en">In a hole in the ground there lived a hobbit.</firstline>
</book>

我知道我可以创建一个使用

unique
约束的模式,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="book">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="title" minOccurs="1" maxOccurs="unbounded">
          <xs:complexType mixed="true">
            <xs:attribute name="lang" use="required" type="xs:language"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
    <xs:unique name="eachLangAtMostOnce">
      <xs:selector xpath="title"/>
      <xs:field xpath="@lang"/>
    </xs:unique>
  </xs:element>
</xs:schema>

这适用于

title
元素,但我需要复制
firstline
元素的代码。它还将强制唯一性的逻辑放入包含元素中 (
book
)。

是否可以创建一个可重复使用的类型来实现我想要的功能?

xml xsd
1个回答
0
投票

在 XSD 1.1 中,您可以通过断言来做到这一点:

<xs:assert test="count(distinct-values(*/concat(local-name(),@lang))) = count(*)"/>
© www.soinside.com 2019 - 2024. All rights reserved.