Não consigo acertar o XPath para o XSD Restrint Only
-
20-09-2019 - |
Pergunta
Eu tenho tentado conseguir o UNIQUE
Restrições colocadas em alguns atributos que tenho em um esquema XSD bastante básico. Estou usando o XMLSPY e querendo colocar uma restrição única em torno do modelo.id para meus nós (ou seja, é importante que eles permaneçam únicos).
Eu coloquei o abaixo no lugar e tentei o seguinte:
Secenario 1
<xs:unique name="uniqueviewid">
<xs:selector xpath="./views"/>
<xs:field xpath="@id"/>
</xs:unique>
Resultado:XSD: valida OK. O XML valida, mas não mantém a restrição única (ou seja, dois ou mais elementos com o mesmo ID não são escolhidos
Cenário 2
<xs:unique name="uniqueviewid">
<xs:selector xpath="views"/>
<xs:field xpath="@id"/>
</xs:unique>
** Resultados*O mesmo que o cenário 1. XSD valida, o XML valida, mas ignora duplicado @id
no elemento de vista
Cenário 3
<xs:unique name="uniqueviewid">
<xs:selector xpath="*"/>
<xs:field xpath="@id"/>
</xs:unique>
Resultados: XSD valida e XML Validats e respeita o construtor exclusivo (ou seja, se duplicar visualizações com @id
Ele lança um invaldo conforme o design).
O problema é que o curinga é "*", o que significa que todos os subnodos do ViewPods serão validados, o que não é o que eu quero. Em vez disso, quero que a contragem seja focada em ViewPos/Views/@ID Exact Path.
Acho que meu XPath está errado, mas não consigo pensar no que estou fazendo especificamente errado?
O exemplo xml.
Este é o exemplo XML.
<config xmlns="http://tempuri.org/RIAGenicConfig.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tempuri.org/RIAGenicConfig.xsd RIAGenicConfig.xsd">
<view>
<viewpods>
<views id="view1"/>
<views id="view1"/>
</viewpods>
</view>
</config>
O XSD em questão.
<xs:schema xmlns="http://tempuri.org/RIAGenicConfig.xsd" xmlns:mstns="http://tempuri.org/RIAGenicConfig.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://tempuri.org/RIAGenicConfig.xsd" elementFormDefault="qualified" id="RIAGenicConfig">
<xs:element name="config">
<xs:complexType>
<xs:sequence>
<xs:element name="view">
<xs:complexType>
<xs:choice>
<xs:element name="viewpods">
<xs:complexType>
<xs:choice>
<xs:element name="views" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="id"/>
</xs:complexType>
</xs:element>
<xs:element name="blah"/>
</xs:choice>
</xs:complexType>
<xs:unique name="uniqueviewid">
<xs:selector xpath="*"/>
<xs:field xpath="@id"/>
</xs:unique>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Solução
Qualifique a seleção XPath para MSTNS: Visualizações em vez de *(todos os elementos):
<xs:unique name="uniqueviewid">
<xs:selector xpath="mstns:views"/>
<xs:field xpath="@id"/>
</xs:unique>