[XML] Regular Expression, XML Schema (XSD)

Pagina: 1
Acties:

  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 16-07-2025
hoi,

ik heb een vraagje over regular expression.

Ik moet een ISBN-nr uitdrukken in een regulier expresie.
(bestaat altijd uit 10 cijfers)

Nu kan dat natuurlijk op de volgende manier:
code:
1
\p{Nd}{10}


Of met koppelstreepjes:
code:
1
\p{Nd|Pd}{13}

(met koppelstreepjes is de (advies)manier die wordt voorgeschreven door de ISBN-Handleiding (zie http://www.isbn-internati.../download/ISBNmanual.pdf"), (mag eventueel ook met spaties ipv koppelstreepjes maar niet volgens deze expressie))

Aangezien dat er voor ieder deel tussen de koppelstreepjes ook regels gelden voor het minimaal en maximale aantal cijfers wil ik ook dit graag in de expresie verwerken. Dat kan dan volgens mij door er een heel aantal te maken met een | (of)-teken ertussen.

Mijn vraag is echter of het ook op een andere manier kan. Via een soort tree.
zeg maar eerst een hele losse en dan steeds specifieker.

Schematische voorstelling (N = Niveau):

N1: Aantal tekens in de string (in dit geval dat 13 (cijfers en streepjes))
N2: Aantal cijfers in het eerste gedeelte (Group identifier)
N2: Aantal cijfers in het tweede gedeelte (Publisher identifier)
N2: Aantal cijfers in het derde gedeelte (Title identifier)
N2: Cijfer voor de Checksum.

dan wel alle N2 op een regel.
N2 zal dan iets worden van:
code:
1
\p{Nd}{1,5}\-\p{Nd}{1,7}\-\p{Nd}{1,6}\-\p{Nd}{1}

N1 moet er dan voor zorgen dat het totaal uit 13 tekens bestaat (dus 10 cijfers + 3 streepjes)

Nog even voor de duidelijkheid (zie titel): Het schema moet voldoen aan het door het w3c opgestelde standaar voor schemas (XSD).

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Als je de pdf leest dan zie je dat voor "purposes of data processing" je geen streepjes of spaties gebruikt; dat suggereert dat het correcte XML schema valideert met [0-9]{9}[0-9X].
checksum mag X zijn
Als je dat niet kunt fixen wordt het lastiger. De afzonderlijke delen van een regex matchen separaat. Je krijgt dan iets als (([0-9]{1}-(([0-9]{2}-[0-9]{7})|([0-9]{3}-[0-9]{6})|([0-9]{4}[0-9]{5})|([0-9]{5}[0-9]{4})|([0-9]{6}[0-9]{3})|([0-9]{7}[0-9]{2}))) | ... )-[0-9X]

Op de plek van de ... moet je dan de subregexen schrijven voor Group identifiers van 2 en 3 lang. Kortom, los het op in code. Regexen zijn dan wel truing-compleet, maar dat wil niet zeggen dat ze overal even handig voor zijn.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 16-07-2025
in de opdracht staat dat het zo streng mogelijk moet. Ik geloof dat ik het daar nog maar eens even met de leraar over moet hebben.

Vooral ook omdat ik het niet logisch vind om deze streepjes dan wel spaties in het document op te slaan. Als ik namelijk het document wil gebruiken met een zoekopdracht is het volgens mij ook niet handig deze streepjes of spatie mee te nemen. Dit zou dan naar mijn mening alleen maar meer werk worden voor als iemand bij het invullen van de zoekopdracht een spatie gebruikt ipv een streepje of andersom. Of nog erger, helemaal geen scheiding tussen de groepen. Waar moet ik dan het streepje laten zetten.

In iedergeval bedankt voor je antwoord.

edit:

[offtopic]
misschien wel een idee voor w3c om deze optie in te bouwen. (als dit nog niet ergens eens is afgewezen natuurlijk :+ )
[/offtopic]

[ Voor 11% gewijzigd door dexter07051982 op 01-11-2004 23:06 ]