Thanks, that's actually reassuring. This case presents as a warning in Oxygen 
which I could ignore because the end result is that the node doesn't match and 
that's the outcome I want. I don't want to ignore it because it's annoying, but 
I could. I was more concerned that maybe there are other cases where it does 
the wrong thing and I would have no way of knowing that. Judging from the issue 
you linked I don't need to worry about that.

Thanks,

--
Danny MacMillan

Sent with [Proton Mail](https://proton.me/) secure email.

------- Original Message -------
On Thursday, May 18th, 2023 at 00:30, Octavian Nadolu <octavian_nad...@sync.ro> 
wrote:

> Hello Danny,
>
> It seems that this is a known issue in Saxon. The short explanation is this: 
> "When we find anelement, then to see if the pattern matches we have to test 
> (a) that its parent is namedrelevant, 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.  It appears that Saxon is evaluating the 
>> map:contains() function when it should not. We have added an issue to the 
>> Saxonica issue tracker to verify the situation and will let you know when 
>> the fix is integrated in Oxygen.
>>
>> 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-oxygen...@mail-eh.ca>](mailto:dm-bulk-oxygen...@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@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@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@oxygenxml.com
https://www.oxygenxml.com/mailman/listinfo/oxygen-user

Reply via email to