Схема XML, определяющая только типы данных атрибута и все значения узлов в виде строки - PullRequest
0 голосов
/ 23 октября 2018

Можно ли определить схему XML, которая определяет только типы данных атрибутов и все значения узлов как строки?

Я имею дело с очень большим файлом XML, который имеет следующую структуру:

<A>
    <A_x1 label="xyz" id="1234">string data</A_x1>
    <A_x2 label="xzy" id="1235">string data</A_x2>
    <A_x...>string data</A_x...>
    ...
</A>
<B>
    <B_x1 label="yzx" id="1236">string data</B_x1>
    <B_x2 label="zyx" id="1237">string data</B_x2>
    <B_x...>string data</B_x...>
    ...
</B>
<C>
    ...
</C>
...

Количество подузлов A, или B, или ... является переменным!

И иногда есть узел A_x1, а иногда нет.

Все, что я знаю навернякакаждый оставляющий узел имеет два атрибута, где 'label' имеет строку типа данных, а 'id' имеет тип данных int.

Я думаю, что это можно определить следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:attribute name="label" type="xs:string"/>
  <xs:attribute name="id"    type="xs:short"/>
</xs:schema>

Но какопределить схему, которая утверждает каждый узел с именем «A_x ...» или «B_x ...» или ... содержит данные типа строки?Или каждый оставляющий узел содержит данные типа string.

Я не смог найти способ использовать регулярные выражения для имен узлов в схеме XML, это вообще возможно?Или каково решение этой проблемы?Если есть один.

1 Ответ

0 голосов
/ 23 октября 2018

К сожалению, даже в XSD 1.1 единственный способ разрешить элементам, которые имеют любое имя, состоит в том, чтобы разрешить им подстановочный знак xs:any, а xs:any не позволяет вам ограничивать типы элементов, которым он соответствует.

Вы можете определить все ограничения с помощью утверждений XSD 1.1:

every $e in child::* satisfies if exists($e/@id) then $e/@id castable as xs:short

но, честно говоря, если вы делаете это, тогда вы получаете так мало значенияиз XSD вы также можете использовать другую технологию для проверки, например XSLT или schematron.

Другая возможность (часто упускаемая из виду) - проверка с использованием конвейера, который сначала преобразовывает (используя XSLT), а затем проверяет(используя XSD).В этом случае часть преобразования будет преобразовывать все имена элементов A_x1 в стандартное имя элемента AA скажем.

Третий вариант - создать схему для вашего конкретного экземпляра документа (снова используя XSLT), а затемпроверить по этой схеме.В этом случае ваша сгенерированная схема может определить все элементы A_x1 как члены группы подстановки некоторого абстрактного элемента AA, и поэтому эти элементы будут проверены на соответствие типу, определенному для AA.

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