XSD указывает, что вхождение соответствует значению в XML

Если у меня есть элемент в XML, который представляет собой целое число, представляющее счетчик n. И если у меня есть элемент с последовательностью элементов, имеющих идентификатор атрибута, который должен начинаться с 1 и идти вверх до n.

Есть ли какой-нибудь способ в xsd гарантировать, что последовательность элементов начинается с атрибута id=1, увеличивается на единицу для каждого следующего элемента и останавливается на номере, указанном значением другого элемента?

Спасибо за отзыв. Я посмотрю на это на следующей неделе.

Минимальный пример XML-файла может выглядеть так:

<root>
  <meta>
    <count>3</count>
  </meta>
  <data>
    <row id = "1">2.1</row>
    <row id = "2">3.6</row>
    <row id = "3">5.4</row>
  </data>
</root>

Таким образом, значение Meta.count должно соответствовать общему количеству элементов строки, и эти элементы должны начинаться с 1 до значения счетчика.

Я попробовал что-то подобное и обнаружил, что, поскольку я не могу охватить братьев и сестер в тесте, мне нужно перенести тест на более высокий элемент, и это работает.

Однако я не могу использовать значение одного из элементов как maxOccurs. Но, возможно, я смогу создать для этого третий тест. Обновлено: Да, можно сравнить количество строк со значением count. Спасибо за поддержку.

<?xml version = "1.0" encoding = "UTF-8"?>
<xs:schema attributeFormDefault = "unqualified" elementFormDefault = "qualified"
           xmlns:xs = "http://www.w3.org/2001/XMLSchema"
           xmlns:vc = "http://www.w3.org/2007/XMLSchema-versioning"
xmlns:xerces = "http://xerces.apache.org" vc:minVersion = "1.1">
            <xs:element name = "row">
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base = "xs:float">
                            <xs:attribute name = "id" use = "required" type = "xs:positiveInteger"/>
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
            </xs:element>
<xs:element name = "root">
    <xs:complexType>
        <xs:sequence>
            <xs:element name = "meta">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name = "count" type = "xs:positiveInteger"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name = "data">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element maxOccurs = "unbounded" ref = "row"/>
                        <!-- <xs:element maxOccurs = "root/meta/count" ref = "row"/> -->
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:assert test = "count(data/row) = meta/count"/>
        <xs:assert test = "max(data/row/@id) = meta/count"/>
        <xs:assert test = "every $x in (1 to meta/count) satisfies data/row[$x]/@id = $x"
                       xerces:message = "Rule #2.1: attribute id shall start at 1 and go up till @total value."/>
    </xs:complexType>
    </xs:element>
</xs:schema>

Ничего не нашел. Вот ограничения схемы: w3schools.com/xml/schema_facets.asp

jdweng 23.08.2024 19:23

Утверждение XSD 1.1 должно справиться с этим.

Yitzhak Khabinsky 23.08.2024 20:28

Задавая вопрос XSD, вам необходимо предоставить минимальный воспроизводимый пример: (1) Правильно сформированный входной XML. (2) Ваша логика и полные исполняемые файлы XSD, которые пытаются ее реализовать. (3) Процессор XSD и его соответствие стандартам XSD: 1.0 или 1.1.

Yitzhak Khabinsky 23.08.2024 20:30
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В XSD 1.1 вы можете написать что-то вроде

<xs:element name = "parent">
  ...
  <xs:assert test = "every $child in ./child
                   satisfies @id = count($child/preceding-sibling::child)+1"/>
</xs:element>

Спасибо за подсказку. Это решает проблему возрастающего порядка IG.

FordPrefect 24.08.2024 08:11
Ответ принят как подходящий

Попробуйте следующее решение с помощью XSD 1.1 и Xerces.

Если внести небольшие изменения, он будет работать с Saxon и другими процессорами, совместимыми с XSD 1.1.

Даже в Python: Можно ли проверить XML-файл на соответствие XSD 1.1 в Python?

Он использует утверждение с количественным выражением для выражения желаемой логики.

XML

<root total = "5">
    <r id = "1"/>
    <r id = "2"/>
    <r id = "3"/>
    <r id = "4"/>
    <r id = "5"/>
</root>

XSD 1.1

<?xml version = "1.0" encoding = "UTF-8"?>
<xs:schema attributeFormDefault = "unqualified" elementFormDefault = "qualified"
           xmlns:xs = "http://www.w3.org/2001/XMLSchema"
           xmlns:vc = "http://www.w3.org/2007/XMLSchema-versioning"
           xmlns:xerces = "http://xerces.apache.org" vc:minVersion = "1.1">
    <xs:element name = "root">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs = "unbounded" ref = "r"/>
            </xs:sequence>
            <xs:attribute name = "total" use = "required" type = "xs:positiveInteger"/>
            <xs:assert test = "every $x in (1 to @total) satisfies r[$x]/@id = $x"
                       xerces:message = "Rule #2.1: attribute id shall start at 1 and go up till @total value."/>
        </xs:complexType>
    </xs:element>
    <xs:element name = "r">
        <xs:complexType>
            <xs:attribute name = "id" use = "required" type = "xs:positiveInteger"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

Это выглядит многообещающе. Я не узнал о реферале, который вы используете. Пока что я решил навести порядок в своем xsd, определяя типы. Можно ли вместо maxOccurence = "unbounded" указать что-то вроде maxOccurs = "@total"? Можно ли использовать в качестве итогового значение другого элемента вместо значения атрибута родительского элемента?

FordPrefect 24.08.2024 08:06

Боюсь, принятие желаемого за действительное.

Michael Kay 24.08.2024 17:28

@FordPrefect, я предоставил вам надежное работающее решение. Была ли у вас возможность попробовать?

Yitzhak Khabinsky 25.08.2024 02:48

Пока нет, думаю, в понедельник попробую.

FordPrefect 25.08.2024 07:12

@YitzhakKhabinsky Сейчас я попытался преобразовать ваш пример xsd в мой минимальный пример xml, но не смог заставить его работать. Вероятно, нельзя ссылаться на братьев и сестер в утверждении xsd.

FordPrefect 25.08.2024 09:38

Я нашел решение. Спасибо за помощь.

FordPrefect 25.08.2024 10:14

Другие вопросы по теме