Page 1 of 1

How to test in Schematron: element value begins with

Posted: Fri Nov 29, 2013 6:01 pm
by Iwicka
Hi,

I'm a beginner both in schematron and in xpath. I need to write an assertion testing that an element value always begins with a certain string if the attribute has a certain value:

Code: Select all

<communicationChannel communicationChannelCode="WEBSITE">http://www.oxygenxml.com</communicationChannel>
If the attribute is WEBSITE, the communicationChannel value must begin with http:// . Unfortunately, I cannot crack it, would be grateful for any help

Code: Select all

<sch:rule context="communicationChannel/@communicationChannelCode = 'WEBSITE'>
<sch:assert test="communicationChannel [text() ... />
</sch:rule>
That's where I'm stuck. Help please.

Ewa

Re: How to test in Schematron: element value begins with

Posted: Sun Dec 01, 2013 11:27 pm
by Jamil
Hello. I took a quick look at what you are trying to do. I got it to work with the following changes. You will need to change this if you are using namespaces.

First, here is my sample XML document:

Code: Select all

<?xml version="1.0" encoding="UTF-8"?>
<?xml-model href="schematron_xml.sch" type="application/xml" schematypens="http://purl.oclc.org/dsdl/schematron"?>
<test>
<communicationChannel communicationChannelCode="WEBSITE">http://www.oxygenxml.com</communicationChannel>
<communicationChannel communicationChannelCode="WEBSITE">www.oxygenxml.com</communicationChannel>
</test>
Here is my schema:

Code: Select all

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://purl.oclc.org/dsdl/schematron"
queryBinding="xslt2">
<pattern>
<rule context="/test/communicationChannel">
<assert test="./@communicationChannelCode='WEBSITE' and starts-with(.,'http://')">communicationChannel element must start with 'http://'</assert>
</rule>
</pattern>
</schema>

Re: How to test in Schematron: element value begins with

Posted: Sun Dec 01, 2013 11:41 pm
by Jamil
There was a bug in my schema above that I am fixing with this change:

Code: Select all

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://purl.oclc.org/dsdl/schematron"
queryBinding="xslt2">
<pattern>
<rule context="/test/communicationChannel[@communicationChannelCode='WEBSITE']">
<assert test="starts-with(.,'http://')">communicationChannel element must start with 'http://'</assert>
</rule>
</pattern>
</schema>
I found this issue after running a few more negative test scenarios. The issue was trying to combine two tests in a single assert tripped up the validation. Moving the attribute test to the rule's context resolved this.