[oXygen-user] Schematron doesn't respect the full path in the test attribute.
Octavian Nadolu
octavian_nadolu at sync.ro
Thu May 18 01:30:06 CDT 2023
Hello Danny,
It seems that this is a known issue in Saxon. The short explanation is
this: "When we find an|element|, then to see if the pattern matches we
have to test (a) that its parent is named|relevant|, and (b) that the
predicate matches. There's nothing in the spec that says which of these
tests should be done first, and we try to make a decision about which
approach is likely to perform better."
For more details you can check the issue:
https://saxonica.plan.io/issues/6040
Best Regards,
Octavian
On 5/17/2023 3:57 PM, Oxygen XML Editor Support (Octavian Nadolu) wrote:
> Hello Danny,
>
> Thanks again for your feedback.
> ItappearsthatSaxonisevaluatingthemap:contains()functionwhenitshouldnot.WehaveaddedanissuetotheSaxonicaissuetrackertoverifythesituationandwillletyouknowwhenthefixisintegratedinOxygen.
>
>
> Best Regards,
> Octavian
>
>
> On 5/15/2023 8:04 PM, Danny MacMillan wrote:
>> I meant the context attribute of course.
>>
>> I can also silence the warning by defining a variable holding the
>> appropriate elements and using the variable in my rules. This is what
>> I will do in practice. It does look broken to me though.
>>
>> Thanks,
>>
>> --
>> Danny MacMillan
>>
>> Sent with Proton Mail <https://proton.me/> secure email.
>>
>> ------- Original Message -------
>> On Monday, May 15th, 2023 at 10:36, Danny MacMillan
>> <dm-bulk-oxygenxml at mail-eh.ca> wrote:
>>
>>> Hello,
>>>
>>> Consider the following XML:
>>>
>>> <?xml version="1.0"?>
>>> <root>
>>> <relevant>
>>> <element relevant-attribute="this attribute exists only on
>>> elements under relevant"/>
>>> </relevant>
>>> <irrelevant>
>>> <element/>
>>> </irrelevant>
>>> </root>
>>>
>>> And the following Schematron:
>>>
>>> <?xml version="1.0" encoding="UTF-8"?>
>>> <schema xmlns="http://purl.oclc.org/dsdl/schematron"
>>> queryBinding="xslt3"
>>> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>>> xmlns:map="http://www.w3.org/2005/xpath-functions/map">
>>> <ns prefix="map" uri="http://www.w3.org/2005/xpath-functions/map"/>
>>> <let name="some-map" value="map {}"/>
>>> <pattern>
>>> <rule context="/*/relevant/element[map:contains($some-map,
>>> @relevant-attribute)]">
>>> <assert test="true()">Impossible</assert>
>>> </rule>
>>> </pattern>
>>> </schema>
>>>
>>> When I validate the XML with the Schematron, Oxygen prints a warning
>>> that an empty sequence is not allowed as the second argument to
>>> map:contains, which I've determined is because it is testing the
>>> "element" elements under "irrelevant". I know this because if I add
>>> a second such element, the error prints twice. If I have 9, the
>>> error prints 9 times. But why is it testing that element? I
>>> deliberately used xpath that navigates via the parent because I want
>>> to include only elements under that parent, but it seems that it's
>>> looking at all elements, anywhere in the document, named 'element'.
>>> Is this expected?
>>>
>>> I can silence the warning if I explicitly check for the presence of
>>> the attribute:
>>>
>>> <?xml version="1.0" encoding="UTF-8"?>
>>> <schema xmlns="http://purl.oclc.org/dsdl/schematron"
>>> queryBinding="xslt3"
>>> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>>> xmlns:map="http://www.w3.org/2005/xpath-functions/map">
>>> <ns prefix="map" uri="http://www.w3.org/2005/xpath-functions/map"/>
>>> <let name="some-map" value="map {}"/>
>>> <pattern>
>>> <rule context="/*/relevant/element[@relevant-attribute and
>>> map:contains($some-map, @relevant-attribute)]">
>>> <assert test="true()">Impossible</assert>
>>> </rule>
>>> </pattern>
>>> </schema>
>>>
>>> But not if I precede the broken rule with a rule that should
>>> equivalently prevent the broken rule from firing on those elements:
>>>
>>> <?xml version="1.0" encoding="UTF-8"?>
>>> <schema xmlns="http://purl.oclc.org/dsdl/schematron"
>>> queryBinding="xslt3"
>>> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>>> xmlns:map="http://www.w3.org/2005/xpath-functions/map">
>>> <ns prefix="map" uri="http://www.w3.org/2005/xpath-functions/map"/>
>>> <let name="some-map" value="map {}"/>
>>> <pattern>
>>> <rule context="/*/relevant/element[not(@relevant-attribute)]">
>>> <assert test="true()">Impossible</assert>
>>> </rule>
>>> <rule context="/*/relevant/element[map:contains($some-map,
>>> @relevant-attribute)]">
>>> <assert test="true()">Impossible</assert>
>>> </rule>
>>> </pattern>
>>> </schema>
>>>
>>> Thanks,
>>>
>>> --
>>> Danny MacMillan
>>>
>>> Sent with Proton Mail <https://proton.me/> secure email.
>>
>>
>> _______________________________________________
>> oXygen-user mailing list
>> oXygen-user at oxygenxml.com
>> https://www.oxygenxml.com/mailman/listinfo/oxygen-user
>
>
> --
> Octavian Nadolu
> <oXygen/> XML Editor
> http://www.oxygenxml.com
>
> _______________________________________________
> oXygen-user mailing list
> oXygen-user at oxygenxml.com
> https://www.oxygenxml.com/mailman/listinfo/oxygen-user
--
Octavian Nadolu
<oXygen/> XML Editor
http://www.oxygenxml.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.oxygenxml.com/pipermail/oxygen-user/attachments/20230518/b02cc5f3/attachment.htm>
More information about the oXygen-user
mailing list