【问题标题】:XSD 1.1 Assert to Count and Compare ElementsXSD 1.1 断言计数和比较元素
【发布时间】:2017-01-11 16:10:28
【问题描述】:

我目前有一个 XSD 文件,它控制对我相应 XML 文件的验证等,我想控制(最好使用断言命令而不是 XLST [因为我对此一无所知])并且能够确保 abc:Country 标签与 abc:AccountNumber 标签的数量相同,因为一个应该对应另一个

    <abc:Account>
      <abc:Individual>
        <abc:Country>Germany</abc:Country>
        <abc:Country>Australia</abc:Country>
        <abs:AccountNumber issuedBy="DE">123456</abs:AccountNumber>
        <abs:AccountNumber issuedBy="AU">654321</abs:AccountNumber>
      </abc:Individual>
    </abc:Account>

请有人帮助我使用我可以用来执行此验证的断言命令吗?

我尝试了以下无济于事...

    <xsd:assert test="if (count (abc:Account/abc:Individual/abc:Country) eq (count (abc:Account/abc:Individual/AccountNumber))) then true() else false() "/>

或者这个....

    <xsd:assert test="count (abc:Account/abc:Individual/abc:Country) eq count (abc:Account/abc:Individual/AccountNumber)"/>

我认为使用 XSD 1.1 可以做到这一点?

任何帮助将不胜感激....谢谢

【问题讨论】:

    标签: xsd assert


    【解决方案1】:

    我认为在 abc:Individual 元素的类型定义中包含断言是最有意义的,那么断言就是:

    count(abc:Country) eq count(abc:AccountNumber)
    

    完整的架构是这样的。为简单起见,我将 AccountNumber 保留在 abc 命名空间中,但可以很容易地用引用替换它。

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:abc="http://www.example.com/abc"
        targetNamespace="http://www.example.com/abc"
        xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
        vc:minVersion="1.1">
        <xs:element name="Account">
            <xs:complexType>
                <xs:sequence>
                    <xs:element ref="abc:Individual" maxOccurs="unbounded" />
                </xs:sequence>
            </xs:complexType>
        </xs:element>
        <xs:element name="Individual">
            <xs:complexType>
                <xs:sequence>
                    <xs:element ref="abc:Country" maxOccurs="unbounded" />
                    <xs:element ref="abc:AccountNumber" maxOccurs="unbounded" />
                </xs:sequence>
                <xs:assert test="count(abc:Country) eq count(abc:AccountNumber)"/>
            </xs:complexType>
        </xs:element>
        <xs:element name="Country" type="xs:string"/>
        <xs:element name="AccountNumber">
            <xs:complexType>
                <xs:simpleContent>
                    <xs:extension base="xs:string">
                        <xs:attribute name="issuedBy" type="xs:string"/>
                    </xs:extension>
                </xs:simpleContent>
            </xs:complexType>
        </xs:element>
    </xs:schema>
    

    除了将 abs 更改为 abc 之外,原始文档已成功验证架构,即:

    <?xml version="1.0" encoding="UTF-8"?>
    <abc:Account
        xmlns:abc="http://www.example.com/abc"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.example.com/abc test.xsd">
        <abc:Individual>
            <abc:Country>Germany</abc:Country>
            <abc:Country>Australia</abc:Country>
            <abc:AccountNumber issuedBy="DE">123456</abc:AccountNumber>
            <abc:AccountNumber issuedBy="AU">654321</abc:AccountNumber>
        </abc:Individual>
    </abc:Account>
    

    【讨论】:

    • Ghislain Fourny 非常感谢您!快速简洁的响应,正如我所愿!谢谢!!! :)
    猜你喜欢
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多