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"/>