Re: All teidata.pointer attributes

Conal Tuohy <[email protected]>
Newsgroups gmane.text.tei.general
Message-ID <CAErBQuQDZ0Q7C176P01G99iUbeveoFYDfEJLAqFzLEnoj8Umhw@mail.gmail.com>
Whoops I made a mistake in that message (I blame the Brisbane summer heat!)

The code I had inside the templates was wrong:

   <!-- wrong! -->
   <xsl:copy>
      <xsl:attribute name="haspointer">true</xsl:attribute>
      <xsl:copy-of select="@* | node()"/>
   </xsl:copy>

It should of course have applied templates to the children of the matched
elements:

   <xsl:copy>
      <xsl:attribute name="haspointer">true</xsl:attribute>
      <xsl:copy-of select="@*">
      <xsl:apply-templates/>
   </xsl:copy>

[turning the fan on now]

On 5 February 2017 at 19:07, Conal Tuohy <[email protected]> wrote:

> Borrowing Lou's suggested XPath, let me suggest a couple of ways to deploy
> it in XSLT:
>
> If you are using XSLT 2.0 (or later), then you can record the list of
> "pointer" elements' names in a global variable, and then define a template
> which matches elements whose names appear in that list.
>
> <xsl:variable name="pointer-element-names" select="
>    document('http://www.tei-c.org/release/xml/tei/odd/p5subset.xml')
>       //t:elementSpec[t:attList/t:attDef/t:datatype/t:dataRef/@
> key='teidata.pointer']
>       /@ident
> "/>
>
> <xsl:template match="*[local-name() = $pointer-element-names]">
>    <!-- process the pointer element -->
>    <xsl:copy>
>       <xsl:attribute name="haspointer">true</xsl:attribute>
>       <xsl:copy-of select="@* | node()"/>
>    </xsl:copy>
> </xsl:template>
>
> That's likely to be the most efficient approach, because the "//" step is
> expensive (traversing the entire ODD document), and storing the result in a
> variable means you only perform this traversal once.
>
> You can't do this in XSLT 1, though, because references to variables are
> not allowed in template match expressions. You could, however, do something
> like this:
>
> <xsl:template match="*">
>    <xsl:copy>
>       <xsl:if test="local-name() = $pointer-element-names">
>          <xsl:attribute name="haspointer">true</xsl:attribute>
>       </xsl:if>
>       <xsl:copy-of select="@* | node()"/>
>    </xsl:copy>
> </xsl:template>
>
> Also in XSLT 1 you should be able to do without a variable, by including
> the "document()" function call in the match expression, but performance
> might not be very good (because of the "//" step, and also because some
> older XSLT processors might not cache the result of the "document()"
> function call).
>
> <xsl:template match="
>    *[
>       local-name()=document('http://www.tei-c.org/release/xml/tei/
> odd/p5subset.xml')
>          //t:elementSpec[t:attList/t:attDef/t:datatype/t:dataRef/@
> key='teidata.pointer']
>          /@ident
>    ]
> ">
>    <xsl:copy>
>       <xsl:attribute name="haspointer">true</xsl:attribute>
>       <xsl:copy-of select="@* | node()"/>
>    </xsl:copy>
> </xsl:template>
>
>
> On 5 February 2017 at 09:17, Lou Burnard <[email protected]>
> wrote:
>
>> This information is not available from the document instance: you need to
>> look at the ODD from which the schema that validates the document instances
>> was generated.
>>
>> If you're using a document that is valid against TEI all, this will list
>> all the elements concerned:
>>
>> <xsl:template xmlns:t="http://www.tei-c.org/ns/1.0"
>> <http://www.tei-c.org/ns/1.0> match="/">
>>    <xsl:for-each select="document('http://www.*tei*-c.org/release/*xml*/
>> *tei*/odd/*p5subset*.*xml*l')//t:elementSpec[
>> t:attList/t:attDef/t:datatype/t:dataRef/@key='teidata.pointer']">
>>        <xsl:message><xsl:value-of select='@ident'/></xsl:message>
>>    </xsl:for-each>
>>
>>
>> On 04/02/17 22:52, John P. McCaskey wrote:
>>
>> Running an XSL transform against a TEI document, I want to match all TEI
>> elements that contain at least one teidata.pointer attribute.
>>
>> I can’t match just on attribute name. In some elements @value is a
>> pointer, in others it’s text. Sometimes @class is a pointer, sometimes not.
>>
>> Is there a master list of attributes that can be pointers and the
>> elements in which they are?
>>
>> (Even better if the list is in a form that makes it easy to use in an XSL
>> match. Double extra better if you can show me the very XSLT that will copy
>> the element and add an attribute “haspointer=’true’”!)
>>
>> Thanks!
>> John
>>
>>
>>
>
>
> --
> Conal Tuohy
> http://conaltuohy.com/
> @conal_tuohy
> +61-466-324297 <0466%20324%20297>
>



-- 
Conal Tuohy
http://conaltuohy.com/
@conal_tuohy
+61-466-324297
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.