XSD Padrão de expressão regular: este ou nada
-
26-09-2019 - |
Pergunta
Estou tentando definir uma regra do esquema no XSD, para a qual uma string tem 8 caracteres:
<PostedDate>42183296</PostedDate>
E também é permitido a preenchimento de espaço:
<PostedDate> </PostedDate>
O que me levou ao XSD:
<xs:simpleType name="DateFormat">
<xs:restriction base="xs:string">
<xs:length value="8" /> //exactly 8 characters long
</xs:simpleType>
mas o valor posso também esteja vazio (ou seja, caracteres zero):
<PostedDate></PostedDate>
<PostedDate />
O que me levou a tentar ingenuamente:
<xs:simpleType name="DateFormat">
<xs:restriction base="xs:string">
<xs:length value="8" /> //exactly 8 characters long
<xs:length value="0" /> //exactly 0 characters long
</xs:simpleType>
O que, é claro, não é permitido.
Como costuma ser o caso no XSD, a maioria dos formatos não pode ser representada facilmente com o XSD, então optei por experimentar uma regra de expressão regular:
.{8} | ""
que tentando converter para xsd eu digito:
<xs:simpleType name="DateFormat">
<xs:restriction base="xs:string">
<xs:pattern value=".{8}|''" />
</xs:restriction>
</xs:simpleType>
Mas não funcionou:
''20101111' is not facet-valid with respect to pattern '.{8}|''' for type 'DateFormat'
Eu também tentei
<xs:pattern value="[0-9]{8}|''" />
<xs:pattern value="([0-9]{8})|('')" />
<xs:pattern value="(\d{8})|('')" />
Qualquer pessoa de outra pessoa pode ser um padrão que resolva o problema correspondente - algum padrão específico - vazio
Bônus: Alguém pode apontar para o lugar em A documentação do XSD Isso diz isso \d
Matches dígitos? Ou quais são os outros códigos de padrão especiais?
Solução
Posso adivinhar que os padrões devem parecer \d{8}|
Isso significa "oito dígitos ou nada", mas não oito dígitos ou duas citações. No entanto, isso não explica, por que 20101111
não é correspondido. Tem certeza de que não há espaços em branco ou outros símbolos adicionais no valor do elemento?
\d
Diz -se que corresponde a dígitos na seção "F.1.1 Classe de caracteres escapes"
Outras dicas
Eu também na mesma situação, como a corda vazia, é permitida, caso contrário, ela deve 6 números de comprimento. Por fim, usei como o seguinte. Isso funciona para mim
<xs:simpleType name="DateFormat">
<xs:restriction base="xs:string">
<xs:pattern value="|[0-9]{8}" />
</xs:restriction>
</xs:simpleType>