Проблемы со ссылками на XML-схемы, возможно проблема с рекурсивными элементами
Хорошо, я так долго бился об эту голову, думаю, я так сильно повредил свой мозг, что забыл Шекспира. Все нормально, я его не так часто использую. Вот моя проблема.
У меня есть список фруктов в верхней части XML-документа. Это, так сказать, "справочная таблица".
Затем я создаю систему меню ниже. Каждое меню может иметь больше меню или список продуктов. Эти продукты должны соответствовать фруктам наверху.
Я был в состоянии подтвердить, что список фруктов заполняется, и даже могу получить ключ, чтобы подтвердить один уровень меню. Но я не могу заставить его проверить все дерево меню. Я отметил места, которые пытался запустить, с помощью keyref <!-- KEY FAIL -->
,
Я использую xmllint для проверки. Если я делаю какие-либо xpath с // в них, я получаю "Cannot compile".
Вот пример XML:
<Snarf xmlns="" xsi:noNamespaceSchemaLocation="mySchema.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Fruit name="apple" />
<Fruit name="orange" />
<Fruit name="watermelon" />
<Blarg>
<Menu name="Top Menu">
<Menu name="Skillz">
<Menu name="Juizy">
<Product>orange</Product>
<Product>watermelon</Product>
</Menu>
<Menu name="nutty">
<Product>orange</Product>
</Menu>
</Menu>
<Menu name="Applz">
<Product>apple</Product>
</Menu>
</Menu>
</Blarg>
</Snarf>
Вот XSD:
<xs:complexType name="productmenu">
<xs:choice minOccurs="1" maxOccurs="1">
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="Menu" type="productmenu">
<!-- KEY FAIL -->
<!-- <xs:keyref name="subMenuProductRef" refer="productNumber">
<xs:selector xpath="Menu"/>
<xs:field xpath="Product"/>
</xs:keyref> -->
</xs:element>
</xs:choice>
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="Product" type="xs:integer"
minOccurs="1" maxOccurs="unbounded"/>
</xs:choice>
</xs:choice>
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
<xs:element name="Snarf">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Fruit" maxOccurs="unbounded" minOccurs="1" type="string"/>
<xs:element name="Blarg" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="Menu" type="productmenu"
maxOccurs="unbounded" minOccurs="1">
<!-- KEY FAIL -->
<!-- <xs:keyref name="subMenuProductRef" refer="productNumber">
<xs:selector xpath="Menu"/>
<xs:field xpath="Product"/>
</xs:keyref>-->
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
<!-- KEY FAIL -->
<!-- <xs:keyref name="menuProductRef" refer="productNumber">
<xs:selector xpath="Menu"/>
<xs:field xpath="Product"/>
</xs:keyref> -->
</xs:element>
</xs:choice>
</xs:complexType>
<xs:key name="productNumber">
<xs:selector xpath="./Product"/>
<xs:field xpath="@num"/>
</xs:key>
<!-- KEY FAIL -->
<!-- <xs:keyref name="menuProductRef" refer="productNumber">
<xs:selector xpath="./Blarg/Menu"/>
<xs:field xpath="Product"/>
</xs:keyref> -->
</xs:element>
1 ответ
Селектор относительно его контекста, поэтому с keyRef
внутри Menu
селектор будет Product
и поле в селекторе просто .
:
<xs:element name="Menu" type="productmenu">
<xs:keyref name="subMenuProductRef" refer="productNumber">
<xs:selector xpath="Product"/>
<xs:field xpath="."/>
</xs:keyref>
</xs:element>
Ваш xs:key
должно быть больше похоже на:
<xs:key name="productNumber">
<xs:selector xpath="./Fruit"/>
<xs:field xpath="@name"/>
</xs:key>
но я предполагаю, что вы просто не продезинфицировали его для примера, как другие части.