2017-09-08 1 views
0

J'ai un attribut XML qui contient l'expression régulière:XSD: attribut pour l'expression régulière

<RegexPath regex="someRegex"/> 

Je veux faire XSD approprié pour lui:

<xs:complexType name="RegexPath"> 
    <xs:attribute name="regex" type="xs:regex??" use="required"/> 
</xs:complexType> 

Y at-il une définition de type de données pour expression régulière dans XSD? Ce n'est pas quelque chose d'important pour la survie, mais il serait agréable de pouvoir détecter une regex invalide via le validateur xsd ...

Répondre

0

Il n'y a pas de type de données "regex" primitif ou intégré défini par le W3C . Ce qui est possible est d'utiliser des expressions régulières sur la face de modèle de définitions de types simples. Cela signifie que vous pourriez théoriquement créer votre propre type de données pour valider l'expression régulière, mais cela pourrait être une implémentation assez complexe.

+0

C'est exactement ce que je voulais éviter. Comme XSD supporte nativement la regex, je m'attendrais à ce qu'ils fournissent aussi une validation intégrée comme définition de pièce ... mais il semble que ça ne marche pas comme ça ... –

1

Peut-être étonnamment, il n'y a aucune expression régulière qui correspond exactement à toutes les expressions régulières valides (et rien d'autre). C'est parce que la grammaire pour les expressions régulières est récursive, ce qui signifie que ce n'est pas une grammaire régulière (au sens informatique du terme), ce qui signifie qu'elle ne peut pas être décrite par une expression régulière.

Vous pourriez le faire (avec un truc) en utilisant des assertions dans XSD 1.1. L'astuce repose sur le fait qu'une assertion qui échoue avec une erreur XPath est traitée comme si l'assertion était fausse. Donc l'assertion

matches("", $value) or true() 

échoue si $ value n'est pas une expression rationnelle valide, et renvoie vrai sinon. Cependant, vous devrez peut-être faire un peu plus de supercherie pour éviter que l'optimiseur XPath intelligent ne le fasse. Il est probablement sûr de l'écrire comme

if (matches("", $value)) 
then string-length($value) gt 0 
else string-length($value) ne 0 

Une mise en garde mineure: Ce test contre le dialecte d'expression régulière XPath qui est légèrement différent du dialecte d'expression régulière XSD.