Как я могу ограничить максимальное вхождение элемента на основе другого значения элемента в XML

#xml #xsd #altova #xmlspy

Вопрос:

У меня есть элемент «АЗБУКА». Для этого элемента есть 3 дочерних элемента. a,b и c, и они имеют тип integer. а максимальное вхождение элемента c равно бесконечности. если значение элемента » a «равно 1, а» b «равно 2, то вхождение» c » должно быть 3. Могу ли я динамически установить максимальное вхождение элемента c? или на основе значения элементов » a » и «b», например:Обратитесь к изображениям, Обратитесь к скриншоту кода , Обратитесь к скриншоту сообщения об ошибке , Обратитесь к скриншоту значения

Комментарии:

1. В XSD 1.1 это можно проверить с помощью утверждения. Используете ли вы XSD 1.0 или 1.1?

Ответ №1:

Схема XSD 1.1 с xs:assert :

    <xs:element name="ABC">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="a" type="xs:integer"/>
                <xs:element name="b" type="xs:integer"/>
                <xs:element name="c" type="xs:string" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:assert id="restrict-occurence" test="count(c) = a   b"/>
        </xs:complexType>
    </xs:element>
 

Таким образом, образец, подобный

 <?xml version="1.0" encoding="UTF-8"?>
<ABC xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="assert-example1.xsd">
    <a>1</a>
    <b>2</b>
    <c>foo</c>
    <c>bar</c>
    <c>baz</c>
</ABC>
 

считается действительным, пока

 <?xml version="1.0" encoding="UTF-8"?>
<ABC xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="assert-example1.xsd">
    <a>1</a>
    <b>2</b>
    <c>foo</c>
</ABC>
 

вызывает ошибку проверки об ошибке утверждения: Assertion evaluation ('count(c) = a b') for element 'ABC' on schema type '#AnonType_ABC' did not succeed. .

Протестировано с помощью Xerces в кислороде, у меня здесь нет XMLSpy для тестирования.

Убедитесь, что вы используете версию, которая поддерживает/включила поддержку XSD schema 1.1.

Комментарии:

1. Спасибо вам за ваш ответ. Но это не работает

2. @ANUJIVARGHESE, у меня нет XML-шпиона, но я тестировал в oXygen с поддержкой Xerces, Saxon и XSD 1.1, и утверждение образца, похоже, сделало то, чего, как я понял, вы хотите достичь, я добавлю образцы в ответ. Объясните более подробно, произошла ли у вас ошибка, какая именно или что именно происходит.

3. Пожалуйста, обратитесь к прилагаемым скриншотам. Это не работает в altova xmlspy

4. @ANUJIVARGHESE, хотя скриншоты могут помочь, пожалуйста, также поделитесь минимальными, но полными образцами XML и XSD в виде фрагментов кода. Я предполагаю, что это может быть проблемой с пространством имен, но это невозможно определить, не увидев минимальные, но полные образцы кода. Можете ли вы попробовать, не дает ли сбой простой пример, основанный на вашем первоначальном вопросе и использованный в моем ответе, также в Altova? В этом примере не используются пространства имен.

5. @ANUJIVARGHESE, в качестве альтернативы, конечно, спросите службу поддержки Altova, могут ли они помочь вам с этой проблемой.