XSD ограничивает тип xsd, а также разрешает атрибуты - PullRequest
1 голос
/ 10 октября 2010

Я новичок в XML и сейчас работаю над XSD. Я должен проверить документ XML, основанный на кредитных картах. Я выполнил большую часть задания, но застрял при объявлении элемента, который должен быть положительным числом с плавающей запятой, и в то же время позволил этому элементу иметь обязательный атрибут, с которым должен быть связан трехбуквенный тип валюты.

Вот пример элемента XML, который я должен проверить:

<total curId="USD">4003.46</total>

Вот что у меня есть:

<xsd:element name="total" type="validAmount"/>

    <xsd:complexType name="validAmount">
        <xsd:simpleContent>
            <xsd:extension base="xsd:decimal">
                <xsd:attribute name= "curId" type = "currencyAttribute" use="required"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>

Для атрибута curId:

<xsd:simpleType name="currencyAttribute">
    <xsd:restriction base="xsd:string">
        <xsd:pattern value="[A-Z]{3}"/>
    </xsd:restriction>
</xsd:simpleType>

Проблема, с которой я столкнулся, заключается в попытке изменить расширение на ограничение, позволяя десятичному числу быть положительным числом (возможно, изменив его тип на строку и используя фасет шаблона, чтобы ограничить его положительным числом). Однако скрипт, который я использую для проверки XML-документа, выдает ошибки, если я это сделаю. Я знаю, что, возможно, упускаю что-то болезненно очевидное, но, как я уже сказал, я новичок в этом, поэтому любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 27 марта 2014

XSD не позволяет вам достичь того, что вы хотите, одним «выстрелом»; вам нужно сначала определить ограниченный простой тип (ниже в restrictedDecimal type), а затем расширить его с помощью атрибутов (ключ здесь - использование simpleContent).

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="total" type="validAmount"/>

    <xsd:simpleType name="restrictedDecimal">
        <xsd:restriction base="xsd:decimal">
            <xsd:minInclusive value="0"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:complexType name="validAmount">
        <xsd:simpleContent>
            <xsd:extension base="restrictedDecimal">
                <xsd:attribute name= "curId" type = "currencyAttribute" use="required"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>

    <xsd:simpleType name="currencyAttribute">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="[A-Z]{3}"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>
0 голосов
/ 31 мая 2011

http://www.w3.org/TR/xmlschema-2/#decimal

Этот тип может быть ограничен с помощью фасета minInclusive, который делает то, что вы хотите.

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