Re: constraining a constraint placed inside a classSpec

Piotr Bański <[email protected]> Sun, 26 Mar 2017 12:25:39 +0200
Newsgroups gmane.text.tei.general
Message-ID <[email protected]>
Dear Martin, Syd and Peter,

Thank you all for your replies.
What I wanted to figure out was whether I was missing some trick that 
allows us to tie the context of a constraint built inside an attribute 
class only to the elements that are members of that class. You've all 
figured that out correctly :-)

And you have all confirmed that this can't be done now, and that perhaps 
it will be doable in the future, but I shouldn't hold my breath. Fair 
enough.

Indeed, I've tried to do what Martin suggests (and what Syd considered), 
but because the attributes are not unique across the entire TEI 
repertoire, it looks like I am getting into conflicts with attributes 
defined elsewhere.

I have pondered two ways of coping with this, (1) either moving the 
constraints that cause conflicts into the element spec (and then 
expecting users to mode="add" such constraints to other elements that 
join the class, or (2) tying them explicitly to element names, like what 
Syd suggested, and then expect users to redefine that constraint (and 
the class) in their ODDs. Neither solution is perfect (well, both are 
kludges), but after a while of thinking it seems to me that solution (2) 
localizes the problem better (because once the ODD builder decides to 
add their element to that particular class, they can perform the kludge 
demanded by that class, rather than look at the specs of other elements).

                            * * *

I'm wondering whether a temporary hash-like structure could solve this, 
whereby whenever the ODD processor, while going through an elementSpec 
for "element-ident.1", encounters, say,

`<memberOf key="att.pointing"/>`

it builds a hash with

class-ident  :  element-ident.1, element-ident.2, ...

so at some point, it would be

att.pointing: alt, calendar, catRef, gloss, ...
                          (+ whatever the user does)

and then potentially writes it out to a temporary file, readable at the 
moment when contexts inside classes need to be established. I'm not 
making this in any way precise because I don't know yet how the 
Stylesheets work, internally. But maybe it would be an alternative to 
re-scanning the entire ODD each time when odds/extract-isosch.xsl tries 
to establish the context. Of course, there's always pros and cons of 
such solutions, and I suspect that this one has already been considered.

Thanks and best wishes,

   Piotr



On 26/03/17 05:11, Martin Holmes wrote:
> Hi Piotr,
>
> I'm having a bit of difficulty figuring out exactly what you need; could
> you explain the real constraint you're trying to add? In so far as I
> think I understand, you want to apply a constraint to all elements that
> belong to a specific attribute class; surely that would be simple to do
> by specifying a context which filters them by the particular set of
> attributes which are provided by that class?
>
> <sch:rule context="tei:*[@myAtt1 and @myAtt2]">
>
> Cheers,
> Martin
>
> On 2017-03-25 07:26 AM, Piotr Bański wrote:
>> I'm sure everyone is dying to hear more about this, so here we go.
>>
>> I have now prepared a constraintSpec that silences the warnings (traced
>> them to odds/extract-isosch.xsl in Stylesheets):
>>
>> <constraintSpec scheme="schematron" ident="die_bunny_die"
>>         xmlns:sch="http://purl.oclc.org/dsdl/schematron">
>>   <constraint>
>>     <sch:rule context="*[@n]">
>>       <sch:report test="@n eq 'bunny'">whenever this rule is
>>             triggered, a cute little bunny dies...</sch:report>
>>     </sch:rule>
>>   </constraint>
>> </constraintSpec>
>>
>> ... and I feel like a real monster now. I can kill bunnies just by
>> pressing "Ctrl+V", anywhere in the tree...
>>
>> Do I think correctly that what I need is some clever way of saying
>> something like "insert here the ident of the element which happens to be
>> added to this class", and furthermore, that there is currently no way to
>> do that?
>>
>> Thanks!
>>
>>   Piotr
>>
>> PS. Erratum: In my earlier message, I meant "root node" where I said
>> "root element", and it wasn't relevant anyway...
>>
>>
>> On 25/03/17 04:01, I wrote:
>>> Hi again,
>>>
>>> While compiling schemas for a modification that I'm working on, I can
>>> see something like this:
>>>
>>>  [xslt] WARNING: constraint for att.referring class does not have a
>>> context=. Resulting rule is applied to *all* elements.
>>>
>>> Which is very true, because I have moved some constraintSpecs from an
>>> element spec (where, I gather, the element being defined supplies the
>>> context) into a spec containing a definition of a new attribute class
>>> that the element now belongs to.
>>>
>>> I have searched the Guidelines for some examples, but failed to see any
>>> that would use "context=" with Schematron. A modified example that I
>>> earlier received from Syd has this:
>>>
>>> <constraint>
>>>   <sch:rule context="*[@referringMode eq 'pointer']"> ...
>>>
>>> and it works really well, but is that the magic that I need for
>>> restricting Schematron to only the elements which are members of the
>>> class that I am defining?
>>>
>>> A naive reading of the above context would suggest that the Schematron
>>> rule still applies to all elements except the root element (and then it
>>> of course filters them appropriately). So where is the trick, please,
>>> what am I missing?
>>>
>>> Thanks in advance,
>>>
>>>    Piotr
>>>
>