XPath 唯一元素不工作
XPath Unqiue Element Not Working
这是我的架构:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="chessGame">
<xs:complexType>
<xs:sequence>
<xs:element name="pawns" type="pawns" minOccurs="1" maxOccurs="1"/>
<xs:element name="knights" type="knights" minOccurs="1" maxOccurs="1"/>
<xs:element name="kings" type="kings" minOccurs="1" maxOccurs="1"/>
<xs:element name="queens" type="queens" minOccurs="1" maxOccurs="1"/>
<xs:element name="rooks" type="rooks" minOccurs="1" maxOccurs="1"/>
<xs:element name="bishops" type="bishops" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="dateTime" type="xs:dateTime" use="required"/>
</xs:complexType>
<xs:unique name="uniquePosition">
<xs:selector xpath="chessgame"/>
<xs:field xpath="@position"/>
</xs:unique>
</xs:element>
<xs:complexType name="pawns">
<xs:sequence>
<xs:element name="whitePawn" type="chessPiece" minOccurs="8" maxOccurs="8"/>
<xs:element name="blackPawn" type="chessPiece" minOccurs="8" maxOccurs="8"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="knights">
<xs:sequence>
<xs:element name="whiteKnight" type="chessPiece" minOccurs="2" maxOccurs="2"/>
<xs:element name="blackKnight" type="chessPiece" minOccurs="2" maxOccurs="2"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="kings">
<xs:sequence>
<xs:element name="whiteKing" type="chessPiece" minOccurs="1" maxOccurs="1"/>
<xs:element name="blackKing" type="chessPiece" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="queens">
<xs:sequence>
<xs:element name="whiteQueen" type="chessPiece" minOccurs="1" maxOccurs="1"/>
<xs:element name="blackQueen" type="chessPiece" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="bishops">
<xs:sequence>
<xs:element name="whiteBishop" type="chessPiece" minOccurs="2" maxOccurs="2"/>
<xs:element name="blackBishop" type="chessPiece" minOccurs="2" maxOccurs="2"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="rooks">
<xs:sequence>
<xs:element name="whiteRook" type="chessPiece" minOccurs="2" maxOccurs="2"/>
<xs:element name="blackRook" type="chessPiece" minOccurs="2" maxOccurs="2"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="chessPiece">
<xs:attribute name="position" use="required">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:maxInclusive value="88"/>
<xs:minInclusive value="11"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="isCaptured" type="xs:boolean" use="required"/>
</xs:complexType>
</xs:schema>
我希望每个棋子的位置都是唯一的,但我无法在网上找到任何应用的唯一元素的模式示例,这些元素实际上将模式分解为单独的 complexTypes 和 simpleTypes。
我做错了什么?
问题出在您的选择器上。您希望在 <chessgame>
元素上设置 @position 属性,而需要检查唯一性的标签低两级。
这个选择器工作正常:
<xs:selector xpath="*/*"/>
如果您需要的选择器不像上面那样通用,您可以使用这个——用详尽的标签列表来完成:
<xs:selector xpath="pawns/whitePawn | pawns/blackPawn | knights/whiteKnight | knights/blackKnight"/>
这是我的架构:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="chessGame">
<xs:complexType>
<xs:sequence>
<xs:element name="pawns" type="pawns" minOccurs="1" maxOccurs="1"/>
<xs:element name="knights" type="knights" minOccurs="1" maxOccurs="1"/>
<xs:element name="kings" type="kings" minOccurs="1" maxOccurs="1"/>
<xs:element name="queens" type="queens" minOccurs="1" maxOccurs="1"/>
<xs:element name="rooks" type="rooks" minOccurs="1" maxOccurs="1"/>
<xs:element name="bishops" type="bishops" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="dateTime" type="xs:dateTime" use="required"/>
</xs:complexType>
<xs:unique name="uniquePosition">
<xs:selector xpath="chessgame"/>
<xs:field xpath="@position"/>
</xs:unique>
</xs:element>
<xs:complexType name="pawns">
<xs:sequence>
<xs:element name="whitePawn" type="chessPiece" minOccurs="8" maxOccurs="8"/>
<xs:element name="blackPawn" type="chessPiece" minOccurs="8" maxOccurs="8"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="knights">
<xs:sequence>
<xs:element name="whiteKnight" type="chessPiece" minOccurs="2" maxOccurs="2"/>
<xs:element name="blackKnight" type="chessPiece" minOccurs="2" maxOccurs="2"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="kings">
<xs:sequence>
<xs:element name="whiteKing" type="chessPiece" minOccurs="1" maxOccurs="1"/>
<xs:element name="blackKing" type="chessPiece" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="queens">
<xs:sequence>
<xs:element name="whiteQueen" type="chessPiece" minOccurs="1" maxOccurs="1"/>
<xs:element name="blackQueen" type="chessPiece" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="bishops">
<xs:sequence>
<xs:element name="whiteBishop" type="chessPiece" minOccurs="2" maxOccurs="2"/>
<xs:element name="blackBishop" type="chessPiece" minOccurs="2" maxOccurs="2"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="rooks">
<xs:sequence>
<xs:element name="whiteRook" type="chessPiece" minOccurs="2" maxOccurs="2"/>
<xs:element name="blackRook" type="chessPiece" minOccurs="2" maxOccurs="2"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="chessPiece">
<xs:attribute name="position" use="required">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:maxInclusive value="88"/>
<xs:minInclusive value="11"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="isCaptured" type="xs:boolean" use="required"/>
</xs:complexType>
</xs:schema>
我希望每个棋子的位置都是唯一的,但我无法在网上找到任何应用的唯一元素的模式示例,这些元素实际上将模式分解为单独的 complexTypes 和 simpleTypes。
我做错了什么?
问题出在您的选择器上。您希望在 <chessgame>
元素上设置 @position 属性,而需要检查唯一性的标签低两级。
这个选择器工作正常:
<xs:selector xpath="*/*"/>
如果您需要的选择器不像上面那样通用,您可以使用这个——用详尽的标签列表来完成:
<xs:selector xpath="pawns/whitePawn | pawns/blackPawn | knights/whiteKnight | knights/blackKnight"/>