XML文書に存在するすべての要素にわたって属性の一意性を検証しようとしています。XML文書全体のXSDで属性の一意性を検証する
例XML:
<exampleXml>
<a id="1"/>
<a id="2">
<b id="1"/>
</a>
</exampleXml>
私のXSDスキーマ:
<xs:schema elementFormDefault="qualified">
<xs:element name="exampleXml">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="a">
<xs:complexType>
<xs:complexContent>
<xs:extension base="baseRuleType">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="b">
<xs:complexType>
<xs:complexContent>
<xs:extension base="baseRuleType"/>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique name="duplicateIdsForbidden">
<xs:selector xpath="//"/>
<xs:field xpath="@id"/>
</xs:unique>
</xs:element>
<xs:complexType name="baseRuleType">
<xs:attribute name="id" use="optional"/>
</xs:complexType>
</xs:schema>
xpathが、ここで問題です。私はルートの下にすべての要素にマッチしたいが、戻って上記セレクタのXPath:
Element '{http://www.w3.org/2001/XMLSchema}selector', attribute 'xpath': The XPath expression '//' could not be compiled
私は「*」にXPathを変更することができますが、それが唯一のルートの直接のファミリー・ツリーである要素にid属性を検証します。
DOMDocument::schemaValidate()
を使用して、PHPのlib_xmlでこれを検証しています。どんな助けでも大歓迎です。
属性タイプをIDに設定するか、ID属性にxml:idを使用するだけですか?これにより、一意性が自動的に強化されます。 IDは数字でもNCNamesでもかまいません。 – Gordon
'xpathを '*'に変更することはできますが、ルートの直接の下位要素である要素のid属性のみを検証します。'私はあなたが「トップレベルの要素の直接の*子供*」という意味だと思いますよね? – LarsH