Инструкции по XML (XSD): содержимое элемента - это имя другого элемента - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь выяснить, как написать свою схему XSD, чтобы правильно выразить ссылку на элемент. Вот короткий пример, который объясняет, чего я пытаюсь достичь. У меня есть несколько основных элементов, которые имеют разные (уникальные) имена. Я хотел бы сгруппировать их внутри большего элемента, ссылаясь на них по имени.

XML-файл:

<?xml version="1.0" encoding="UTF-8"?>
<RootNode>
  <BasicElements>
    <BasicElement name="Element1"/>
    <BasicElement name="Element2"/>
    <BasicElement name="Element3"/>
  <BasicElements>

  <ElementGroups>
    <ElementGroup name="ElementsAlongAPath">
      <LeftSide>Element1</LeftSide>
      <RightSide>Element2></RightSide>
    </ElementGroup>
    <ElementGroup name=OtherElementsAlongAPath">
      <LeftSide>Element2</LeftSide>
      <RightSide>Element3</RightSide>
    </ElementGroup>
  </ElementGroups>
</RootNode>

XSD файл

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="TestNS" xmlns:test="TestNS">
  <xs:element name="RootNode">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="test:BasicElements" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element ref="test:ElementGroups" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="BasicElements">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="test:BasicElement" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="BasicElement">
    <!--Attributes, stuff... -->
  </xs:element>
  <xs:element name="ElementGroups">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="test:ElementGroup" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="ElementGroup">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="LeftSide" minOccurs="0" maxOccurs="1">
          <!-- How to express reference to BasicElement here ?-->
        </xs:element>
        <xs:element name="RightSide" minOccurs="0" maxOccurs="1">
          <!-- How to express reference to BasicElement here ?-->
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Я мог бы очень хорошо написать, что LeftSide и RightSide имеют подэлементы type = xs: string и просто написать имя BasicElements, которое я имел выше, но мне было интересно, как это сделать так, чтобы это соответствовало синтаксису XSD. Спасибо!

1 Ответ

0 голосов
/ 06 ноября 2018

Это то, для чего key и keyref. На уровне RootNode определите ключ, чтобы каждый .//BasicElement имел отдельный @name, а keyref, чтобы сказать, что каждые .//LeftSide и .//Rightside должны быть ссылкой на один из этих ключей.

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