HI Wendell,
Thank you very much. Works like a charm.
Regards,
Frank
Frank,
There is an interesting feature of Schematron's design useful in a case like yours, namely that within a pattern, only one rule may apply to any element, and the first rule wins.
This means we can pre-empt the application of rules by writing other rules.
For example:
<sch:pattern id="Check_LI">
<sch:rule context="*[exists(@conref)]//li | li[exists(@conref)]"/>
<sch:rule context="li"><sch:assert test="exists(*)">li must have children</sch:assert></sch:rule>
</sch:pattern>
The second rule says "an li must have children". The first rule intervenes for li elements that have @conref or an ancestor with @conref - it does no checking so it is silent.
Try it and see how it goes --
Cheers, Wendell
On Wed, Feb 22, 2023 at 7:35 AM Frank Dissinger <frank.dissinger@cgs-oris.com> wrote:
Hi all,
I need a Schemtron rule which indicates an error when <li> elements do not have any child elements. No error schould be indicated for <li> elements with an "conkeyref" attribute and also for <li> elements which are children of any element with a "conkeyref" attribute.
I have defined two separate rules...
<sch:pattern id="Check_LI2">
<sch:rule context="li[not(@conkeyref)]">
<sch:assert test="*">List does not contain any child elements</sch:assert>
</sch:rule>
</sch:pattern>
<sch:pattern id="Check_LI3">
<sch:rule context="li[not(parent::*[@conkeyref])]">
<sch:assert test="*">List does not contain any child elements</sch:assert>
</sch:rule>
</sch:pattern>
... but I think I need to combine them into a single rule with an OR or AND operator.
<sch:pattern id="Check_LI3">
<sch:rule context="li[not(@conkeyref)] OR li[not(parent::*[@conkeyref])] ">
<sch:assert test="*">List does not contain any child elements</sch:assert>
</sch:rule>
</sch:pattern>
However, this syntax is invalid. Can somebody help me?
Regards,
Frank
--
Frank Dissinger
Documentation Manager
....................................................................
CGS Publishing Technologies International GmbH
Email frank.dissinger@cgs-oris.com | Web www.cgs-oris.com
Address Kettelerstr. 24 | D-63512 Hainburg | Germany
Phone +49 6182 9626-27 | Fax +49 6182 9626-99
Commercial register Offenbach, HRB no. 21495
Managing directors Bernd Rückert, Christoph Thommessen
![]()