加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

XML模式如何要求按属性对元素进行排序?

发布时间:2020-12-16 23:29:25 所属栏目:百科 来源:网络整理
导读:假设我有一个如下所示的 XML文件: TransactionsTransaction OrderID="5" ... /TransactionTransaction OrderID="6" ... /TransactionTransaction OrderID="11" ... /TransactionTransaction OrderID="7" ... /Transaction/Transactions 使用XML模式,是否可
假设我有一个如下所示的 XML文件:

<Transactions>
<Transaction OrderID="5"> ... </Transaction>
<Transaction OrderID="6"> ... </Transaction>
<Transaction OrderID="11"> ... </Transaction>
<Transaction OrderID="7"> ... </Transaction>
</Transactions>

使用XML模式,是否可以指示订单#11的顺序不正确?
每个Transaction元素都单独通过验证,但OrderID应按递增顺序排列.

并且,一个相关的问题:验证规则是否可以指示是否可以跳过数字?
例如,没有交易#8,9或10.

解决方法

如果验证器支持XSD 1.1,则可以使用xs:assert拒绝某些属性值,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
           elementFormDefault="qualified" 
           attributeFormDefault="unqualified"
           vc:minVersion="1.1">
   <xs:element name="Transactions">
      <xs:complexType>
         <xs:sequence>
            <xs:element name="Transaction" maxOccurs="unbounded">
               <xs:complexType mixed="true">
                   <xs:attribute name="OrderID" type="xs:integer"/>
                   <xs:assert test="empty(index-of((8,9,10),@OrderID))"/>
               </xs:complexType>                                
            </xs:element>
         </xs:sequence>
      </xs:complexType>
   </xs:element>
</xs:schema>

这应该回答你的第二个问题.

至于你的第一个问题,我不认为订单验证是可能的.但是,您可以使用XSLT对XML文档进行排序.

—–添加了第一个问题的答案—–

谢谢Michael Kay.嗯……这是你第一个问题的答案.

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Transactions">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Transaction" maxOccurs="unbounded">
                    <xs:complexType mixed="true">
                        <xs:attribute name="OrderID" type="xs:integer"/>
                        <xs:assert test="empty(index-of((8,@OrderID))"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:assert test="every $x in Transaction satisfies 
                             (empty($x/preceding-sibling::*) or 
                             ($x/@OrderID gt $x/preceding-sibling::*[1]/@OrderID))"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读