Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XML模式如何要求元素按属性排序?_Xml_Xsd - Fatal编程技术网

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

XML模式如何要求元素按属性排序?,xml,xsd,Xml,Xsd,假设我有一个如下所示的XML文件: <Transactions> <Transaction OrderID="5"> ... </Transaction> <Transaction OrderID="6"> ... </Transaction> <Transaction OrderID="11"> ... </Transaction> <Transaction OrderID="7"> ... <

假设我有一个如下所示的XML文件:

<Transactions>
<Transaction OrderID="5"> ... </Transaction>
<Transaction OrderID="6"> ... </Transaction>
<Transaction OrderID="11"> ... </Transaction>
<Transaction OrderID="7"> ... </Transaction>
</Transactions>
<?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>

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

还有一个相关的问题:验证规则能否指示是否可以跳过数字?
例如,没有事务#8、9或10。

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

<Transactions>
<Transaction OrderID="5"> ... </Transaction>
<Transaction OrderID="6"> ... </Transaction>
<Transaction OrderID="11"> ... </Transaction>
<Transaction OrderID="7"> ... </Transaction>
</Transactions>
<?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>

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

<?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,9,10),@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>
至于你的第一个问题,我认为订单验证是不可能的。但是,您可以使用XSLT对XML文档进行排序

-----添加了第一个问题的答案-----

谢谢你,迈克尔·凯。这是你第一个问题的答案

<?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,9,10),@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>


是,可以进行订单验证。例如
谢谢Chong Lip Phang。老实说,我不太明白你的答案,不知道它是否解决了我的问题。当您编写8,9,10时,是否引用OrderID的特定值?我正在处理的文件中有大约30000个事务。任何适合我的方法都需要在不引用OrderID的特定值的情况下工作。如果OrderID的值为8、9或10,则第二个“是”将导致验证失败。如果XML数据很多,那么您可能需要一个规则来匹配特定的模式。如果忽略此断言规则,并且OrderID跳过8、9或10,则验证仍将通过。如果OrderID的值不是按升序排列,则第二个将导致验证失败。这里有两种说法。可以同时省略、使用一个或同时使用两个。这实际上取决于您希望验证的内容。