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>
Foi útil?

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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top