Несколько атрибутов xs: id под одним элементом - определение XSD - PullRequest
0 голосов
/ 27 апреля 2018

В IntelliJ 2015 (IJ) появляется ошибка при попытке определить XSD с элементом, имеющим два атрибута типа «xs: ID». К сожалению, я унаследовал этот код от кого-то давно ушедшего, поэтому не уверен, чего именно он пытался достичь.

Вот урезанная версия XSD:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    ...
    <xs:element name="visitor-test">
        <xs:complexType>
            ...
            <xs:attribute name="null-node" type="xs:ID" default="null-node"/>
            <xs:attribute name="null-id" type="xs:ID" default="null-id"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

А вот и начало XML с ошибкой:

<?xml version="1.0" encoding="UTF-8"?>
<visitor-test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="visitor-test-schema.xsd" null-id="f">

IJ подчеркивает красным и жалуется, что:

Атрибут 'null-id' не может появляться в элементе 'visitor-test

Что работает:

  1. Если я изменю атрибут XML на нуль-узел, т.е. null-node="f">
  2. Если я переверну порядок атрибутов null-node и null-id в XSD (но тогда такая же проблема возникает для null-node)
  3. Если я изменю тип любого атрибута в XSD на xs:String, например. <xs:attribute name="null-node" type="xs:string" default="null-node"/>

Поскольку это не мой код, и я не уверен, для чего они используются, мне интересно, допустил ли мой предшественник определение двух атрибутов ID для одного и того же элемента? Это незаконно в соответствии с "http://www.w3.org/2001/XMLSchema"? И если да, то какой мой выбор" самый безопасный "? Кажется, # 3 ...

Кроме того, # 1 и # 2 вместе означают, что только первый атрибут, определенный в XSD, кажется действительным, последующие не допускаются. Как ни странно, оба атрибута предлагаются в IDE.

1 Ответ

0 голосов
/ 27 апреля 2018

Тип xs:ID в XSD 1.0 ,

3.3.8 ID

[Definition:] ID представляет тип атрибута ID из [XML 1.0 (Второе издание)].

происходит от типа атрибута ID в XML / DTD,

Ограничение допустимости: один идентификатор на тип элемента

В типе элемента не должно быть указано более одного атрибута ID.

где вы можете видеть, что только один ID атрибут разрешен для каждого типа элемента.

Альтернативы xs:unique и xs:key не имеют таких ограничений.


Примечание: В XSD 1.1 допускается несколько атрибутов ID на элемент:

G.1.7 ID, IDREF и родственные типы

Элемент может теперь иметь несколько атрибутов типа xs:ID. элементы всегда могли иметь несколько детей типа xs:ID, но XSD 1.0 запретил несколько атрибутов этого типа для совместимости с XML DTD. (Схемы, предназначенные для перевода в форму DTD, должны все еще избегайте практики.) Это изменение должно облегчить XML словари для поддержки как существующих атрибутов ID, так и xml:ID.

(Спасибо Michael Kay за это полезное обновление.)

...