Est-il possible avec le schéma XML de restreindre la profondeur des éléments enfants imbriqués dans un parent?Limiter la profondeur des éléments imbriqués dans XSD
Le contexte ici est de recueillir des alarmes à partir d'un système de gestion et je souhaite fournir un document XML qui permet à l'utilisateur final de définir certaines règles afin de filtrer les alarmes dans des dossiers dans l'interface utilisateur. Je veux limiter la profondeur des dossiers imbriqués à 3 afin qu'un utilisateur final ne puisse pas imbriquer des centaines de niveaux profonds - car le filtrage de tant de niveaux entraînerait le blocage éventuel de l'application.
Je pourrais écrire du code pour gérer ceci, mais il semble approprié de le définir dans le schéma si c'est possible.
Par exemple, ce serait bien:
<group name="Folder 1">
<group name="Folder 2">
<group name="Folder 3">
<group name="Folder 4">
</group>
</group>
</group>
</group>
Ce serait invalide, comme le dossier 5 est trop profond. Mon schéma ressemble à ceci, mais ne limite pas la profondeur de l'extrait ci-dessus.
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="hierarchy">
<xs:complexType>
<xs:sequence>
<xs:element name="group" type="GroupType" />
</xs:sequence>
<xs:attribute name="name" type="xs:string" />
</xs:complexType>
</xs:element>
<xs:complexType name="GroupType">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="group" type="GroupType" />
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="filterOn" type="xs:string" use="optional" />
<xs:attribute name="operator" type="xs:string" use="optional" />
<xs:attribute name="value" type="xs:string" use="optional" />
</xs:complexType>
</xs:schema>
Des pointeurs très appréciés!
Comment puis-je imbriquer le schéma pour atteindre cet? Malheureusement, je dois utiliser un schéma XML pour cela car je ne peux pas ajouter les bibliothèques tierces (application Java) nécessaires pour prendre en charge RELAX/Schematron en raison de considérations de licence. Je finirai probablement par devoir écrire un code très peu élégant pour supporter cela, même si la solution du schéma est désordonnée, c'est peut-être le moindre de deux maux. – tja
@tja voir mise à jour :) –
parfait, je prends votre point sur l'élégance (ou le manque de). – tja