2017-01-27 4 views
1

Ich habe einen XML-Schnipsel als solche:Wie schreibe ich diesen Schematron Validierungstest für XML Snippet?

<AAA> 
    <Field name="a"/> 
    <Field name="b"/> 
    <Field name="x"/> 
    <User id="x" id2="f"/> 
    <User id="y"/> 
</AAA> 
<AAA> 
    <Field name="r"/> 
    <Field name="z"/> 
</AAA> 

Ich herrsche, dass eine solche benötigen, wenn der Nutzer-Tag vorhanden ist, sollte es, wenn die Attributwerte von id und id2 unter dem existieren zu überprüfen, zu Name Attribut eines Feldes.

So in dem ersten AAA-Tag, wird es bestätigen und 2 Fehler geben, weil "f" nicht als Feldname existiert und auch nicht "y".

Die AAA-Tags nicht immer User-Tags haben, und die User-Tags haben nicht immer beide id und id2.

Ich habe mit einigen XPath-Ausdrücken versucht, aber ohne Erfolg.

+1

Verwenden Sie Schematron mit XPath 2.0 oder 1.0? In XPath 2.0 können Sie leicht 'einige $ Benutzer in Benutzer erfüllt nicht schreiben ($ user/(@ id, @ id2) = Feld/@ name'. –

+0

Das hat es nicht ganz getan. – user3418847

+1

Bitte zeigen Sie ein komplettes Eingabe-XML-Dokument Vielen Dank! "" Das hat es nicht ganz geschafft "ist keine sehr präzise Fehlermeldung. Was genau hat nicht funktioniert? –

Antwort

2

Wenn Sie nicht XPath 2.0 verwenden können, dann können Sie die folgenden Schematron Regeln schreiben:

ISO Schematron

<?xml version="1.0" encoding="UTF-8"?> 
<sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2"> 

    <sch:pattern> 
     <sch:rule context="User[@id]"> 
      <sch:assert test="@id = ../Field/@name">User ID does not exist as a field!</sch:assert> 
     </sch:rule> 

     <sch:rule context="User[@id2]"> 
      <sch:assert test="@id2 = ../Field/@name">User ID2 does not exist as a field!</sch:assert> 
     </sch:rule> 
    </sch:pattern> 

</sch:schema> 

ich einen Eingang XML-Dokument gehe davon aus, dass kein Namensraum hat. Die Assertion schlägt nicht fehl, wenn ein User Element eines dieser Attribute überhaupt nicht besitzt oder wenn ein AAA Element kein User Element hat.

Sie haben nicht sehr deutlich gesagt, warum der Vorschlag von Martin Honnen für Sie nicht funktioniert hat, deshalb liste ich ihn hier auf. Die Regel würde folgendermaßen aussehen:

<sch:pattern> 
    <sch:rule context="AAA"> 
     <sch:report test="some $user in User satisfies not($user/(@id, @id2) = Field/@name)">User ID does not exist as a field!</sch:report> 
    </sch:rule> 
</sch:pattern> 
+0

Vielen Dank! Das war es. Ich konnte keinen Stacktrace oder irgendetwas mehr zeigen spezifisch, weil es für mich keine Möglichkeit gibt, meine Schematron-Behauptungen zu debuggen. Ich wusste nicht, was ich zurückbekommen würde, aber ich wusste, was ich zurückbekam, war falsch. – user3418847

Verwandte Themen