XML模式如何要求元素按属性排序?
假设我有一个如下所示的XML文件:XML模式如何要求元素按属性排序?,xml,xsd,Xml,Xsd,假设我有一个如下所示的XML文件: <Transactions> <Transaction OrderID="5"> ... </Transaction> <Transaction OrderID="6"> ... </Transaction> <Transaction OrderID="11"> ... </Transaction> <Transaction OrderID="7"> ... <
<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的值不是按升序排列,则第二个将导致验证失败。这里有两种说法。可以同时省略、使用一个或同时使用两个。这实际上取决于您希望验证的内容。