XSD для элемента, который должен иметь атрибут в зависимости от значения другого атрибута - PullRequest
2 голосов
/ 28 января 2010

У меня есть тег <font> с необходимыми именами атрибутов, link='notusing' и replaced_with (необязательно, только link значение не является строкой 'notusing').

Также XSD должен проверить, есть ли в xml шрифт с именем, указанным в replaced_with.

Пример:

<fonts>
  <font name='font1' link='inuse'/>
  <font name='font2' link='inuse'/>
  <font name='font3' link='notusing' replaced_with="font2"/>
</fonts>

Как я могу написать XSD для этого? Спасибо

Ответы [ 2 ]

2 голосов
/ 28 января 2010

Я не думаю, что возможно обеспечить, что replaced_with может произойти, только если link='notusing'. Вы можете сделать replaced_with необязательным, используя minOccurs='0', но это все.

Если вы можете изменить структуру XML-файла, вы можете сделать что-то вроде этого:

<?xml version="1.0" encoding="utf-8" ?>
<fontData
  xmlns="someNamespace"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="someNamespace XMLSchema1.xsd">
  <fonts>
    <font name="font1" />
    <font name="font2" />
  </fonts>
  <obsoleteFonts>
    <font name="font3" replaced_with="font2" />
  </obsoleteFonts>
</fontData>

И затем вы могли бы использовать key и keyref для обеспечения того, чтобы имя любого font в obsoleteFonts существовало в fonts.

Вот как будет выглядеть файл XSD для реализации этого формата XML:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema
  xmlns="someNamespace"
  xmlns:tns="someNamespace"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="someNamespace"
  elementFormDefault="qualified">
  <xs:element name="fontData" type="fontData">
    <xs:key name="fontKey">
      <xs:selector xpath="tns:fonts/tns:font" />
      <xs:field xpath="@name" />
    </xs:key>
    <xs:keyref name="obsoleteFontToFontKeyRef" refer="fontKey">
      <xs:selector xpath="tns:obsoleteFonts/tns:font" />
      <xs:field xpath="@replaced_with" />
    </xs:keyref>
  </xs:element>
  <xs:complexType name="fontData">
    <xs:sequence>
      <xs:element name="fonts" type="fonts" />
      <xs:element name="obsoleteFonts" type="obsoleteFonts" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="fonts">
    <xs:sequence>
      <xs:sequence>
        <xs:element name="font" type="font" maxOccurs="unbounded" />
      </xs:sequence>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="obsoleteFonts">
    <xs:sequence>
      <xs:sequence>
        <xs:element name="font" type="obsoleteFont" maxOccurs="unbounded" />
      </xs:sequence>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="font">
    <xs:attribute name="name" type="xs:string" />
  </xs:complexType>
  <xs:complexType name="obsoleteFont">
    <xs:attribute name="name" type="xs:string" />
    <xs:attribute name="replaced_with" type="xs:string" />
  </xs:complexType>
</xs:schema>

Я проверил это с помощью валидатора схемы Visual Studio, но, надеюсь, он будет работать правильно в любой технологии, которую вы используете.

0 голосов
/ 28 января 2010

В XML-схеме (XSD) вы не можете выразить этот вид требования / ограничения. XML-схема - это все о структуре, и вы не можете использовать значения элементов или атрибутов, чтобы влиять на структуру других элементов или атрибутов. Не может быть сделано, это просто не является частью стандарта схемы XML.

Если вам нужны такого рода проверки, взгляните на Schematron , другой тип платформы проверки XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...