Se eu tiver um elemento em um xml, esse é um número inteiro que representa uma contagem n
. E se eu tiver um elemento com uma sequência de elementos que possui um id de atributo que deve começar em 1 e ir até n
.
Existe alguma maneira no xsd de garantir que a sequência de elementos comece com o atributo id=1 e que seja aumentada em um para cada elemento seguinte e pare no número especificado pelo valor de outro elemento?
Obrigado pelo feedback até agora. Vou dar uma olhada nisso na próxima semana.
Um exemplo mínimo de xml poderia ser assim:
<root>
<meta>
<count>3</count>
</meta>
<data>
<row id="1">2.1</row>
<row id="2">3.6</row>
<row id="3">5.4</row>
</data>
</root>
Portanto, o valor de meta.count deve corresponder à ocorrência total dos elementos da linha e esses elementos devem começar de 1 até o valor da contagem.
Tentei agora algo assim e descobri que, como não consigo alcançar irmãos no teste, preciso colocar o teste em um elemento superior e funciona.
Não posso usar o valor de um dos elementos como maxOccurs. Mas provavelmente posso criar um terceiro teste para isso. Editar: Sim, pode-se comparar a contagem das linhas com o valor da contagem. Obrigado pelo apoio.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
xmlns:xerces="http://xerces.apache.org" vc:minVersion="1.1">
<xs:element name="row">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:float">
<xs:attribute name="id" use="required" type="xs:positiveInteger"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="meta">
<xs:complexType>
<xs:sequence>
<xs:element name="count" type="xs:positiveInteger"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="data">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="row"/>
<!-- <xs:element maxOccurs="root/meta/count" ref="row"/> -->
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:assert test="count(data/row) = meta/count"/>
<xs:assert test="max(data/row/@id) = meta/count"/>
<xs:assert test="every $x in (1 to meta/count) satisfies data/row[$x]/@id = $x"
xerces:message="Rule #2.1: attribute id shall start at 1 and go up till @total value."/>
</xs:complexType>
</xs:element>
</xs:schema>
No XSD 1.1 você pode escrever algo como
Tente a seguinte solução via XSD 1.1 e Xerces.
Com pequenos ajustes, ele funcionará com Saxon e outros processadores compatíveis com XSD 1.1.
Mesmo em Python: é possível validar um arquivo XML em relação ao XSD 1.1 em Python?
Está usando uma afirmação com uma expressão quantificada para expressar a lógica desejada.
XML
XSD 1.1