reguläre Ausdrücke XPath/Schematron

sabine84

Grünschnabel
Hallo zusammen!

Ich habe leider folgendes Problem:

Ich möchte gern mit Hilfe von Schematron eine Fehlermeldung ausgeben, wenn im Dateiname (Document_number) an der 21-23. Stelle nicht "ELV" oder "ELX" oder "ELZ" geschrieben ist. D.h. man müsste vielleicht nur die 23.Stelle nach [VXZ] abfragen, das habe ich aber leider nicht hinbekommen:(

hier die XML:
XML:
<kbl:KBL_container>
<External_reference>
<Document_type>KAB</Document_type>
<Document_number>TAB_886_016_JK_KPR_ELV_____300611</Document_number>
</External_reference>
</kbl:KBL_container>

hier mein Versuch in Schematron:
<pattern>
<rule context="//External_reference[Document_type='KAB']">
<assert test="contains(Document_number, '[E][L][VX]'">
Achtung! </assert>
</rule>
</pattern>
Das funktioniert aber leider nicht so wie gedacht :(

Kann mir jemand helfen?

Viele Grüße
 
Zuletzt bearbeitet von einem Moderator:
Welche XPath-Version verwendest du mit Schematron? XPath 1.0 hat keine Unterstützung für reguläre Ausdrücke, die du im Titel deines Posts erwähnst. Für deine Anforderung reicht aber eventuell substring http://www.w3.org/TR/xpath/#function-substring
Code:
<assert test="substring(Document_number, 21, 3) = 'ELV' or substring(Document_number, 21, 3) = 'ELX' or substring(Document_number, 21, 3) = 'ELZ'"/>
 
Hi!

Ich verwende XPath 2.0
Würde es gern über reguläre Ausdrücke abfragen, da ich wenn dies einmal funktioniert noch mehrere Stelle im Name abfragen möchste.

Viele Grüße
 
Hi!

Danke für die schnelle Hilfe!

Scheinbar unterstützt zwar der Oxygen Editor das XPath2.0 aber Schematron nicht.
Ich habe es so versucht wie oben beschrieben, aber Fehlermeldung:

# W [ISO Schematron] Error in expression machtes (Document_number,'^.{20}EL(V|X|Z)'): Unknown system function: matches

Kann ich noch was anderes versuchen?
 
So die matches-Funktion nicht erkannt wird, wird deine Schematron-Implementierung wohl nur XPath 1.0 unterstützen. Unter http://www.xfront.com/schematron/schematron-and-xpath2.html wird erklärt, man könne das für Oxygen konfigurieren
Code:
To switch to XPath 2.0 do this:

    Under Oxygen's Options menu, select Preferences
        Under XML, select XML Parser
            Under "Schematron XPath Version", click on 2.0
Ansonsten frag eventuell in einem Oxygen-Forum nach, so sich hier niemand meldet, der sich damit auskennt.
 
Ich habe auf XPath 2.0 umgestellt. Die Funktion matches geht leider trotzdem nicht.
 
Zuletzt bearbeitet:
Ich habe Schematron bisher nicht mit XPath bzw. XSLT 2.0 benutzt, aber ich habe jetzt mal probeweise http://www.schematron.com/tmp/iso-schematron-xslt2.zip heruntergeladen und dann mit Hilfe von Saxon 9.3 und http://www.dpawson.co.uk/schematron/ folgendes Beispiel probiert: das Schematron-Schema ist
Code:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://purl.oclc.org/dsdl/schematron"
  queryBinding="xslt2"
  schemaVersion="ISO19757-3">
  
  <title>Testing matches function</title>
  
  <pattern>
    <rule context="foo">
      <assert test="matches(bar, '^[A-Z]{5}[0-9]{3}$')">Pattern matches(bar, '^[A-Z]{5}[0-9]{3}$') needs to be matched.</assert>
    </rule>
  </pattern>
  
</schema>
ein Beispiel-Dokument, das geprüft werden soll, ist
Code:
<root>
  <foo>
    <bar>ABCDE123</bar>
  </foo>
  <foo>
    <bar>12345678</bar>
  </foo>
</root>
das funktioniert bei mir dann reibungslos, wenn man in zwei Schritten erst das Schema verarbeitet und dann das im ersten Schritt erhaltene XSLT-Stylesheet auf das XML-Dokument anwendet, Ausgabe ist dann
Code:
Pattern matches(bar, '^[A-Z]{5}[0-9]{3}$') needs to be matched.
Mit Oxygen kann ich nicht helfen, da solltest du unter http://www.oxygenxml.com/forum/ nach einem geeigneten Forum suchen, so hier keine anderen Oxygen-Benutzer lesen, die helfen können.
 

Neue Beiträge

Zurück