Xpath12match.xslt
Jump to navigation
Jump to search
Proof-of-concept that parses out the xpath1() XPointer scheme from the target= of <certainty>. Just to do something with it, it is re-inserted as a new notXSLT:match= attribute. See the recent thread on TEI-L for how the output attribute is different from the XSLT match= attribute, and therefore probably should be named something else.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:notXSLT="http://www.example.org/ns/-1.0"
xmlns:tei="http://www.tei-c.org/ns/1.0" >
<!--
Proof-of-concept that parsing out an xpath() XPointer scheme from a target= is not all
that hard, at least in the simple case. -->
<!--
No atttempt is made to handle harder cases like multiple pointer parts in the fragment
identifier, or an xpath that itself contains '#', or important parts of the fragment
identifier are percent-escaped (is that allowed?) -->
<!--
I make no claim that this is a good way, let alone the best way, to do this. I only
claim that I thought it would work and that it did on my skimpy test data :-) -->
<!--
Written 2009-10-20 by Syd Bauman
Copyright 2009 Syd Bauman and the Brown University Women Writers Project
Available under the Creative Commons Attribution-Share Alike 3.0 United States License
(See http://creativecommons.org/licenses/by-sa/3.0/us/).
-->
<!-- identity transform: anything and everything (except <certainty>, below) becomes itself -->
<xsl:template match="/">
<xsl:apply-templates select="node()"/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- special processing for <certainty> elements that make use of the xpath1() XPointer -->
<!-- scheme -->
<xsl:template match="tei:certainty[contains(@target,'#xpath1')]">
<!-- remember the base URI specified on target= -->
<xsl:variable name="baseURI" select="substring-before(@target,'#')"/>
<!-- remember the fragment identifier (which is an XPointer using the xpath1() scheme) -->
<xsl:variable name="fragID" select="substring-after(@target,'#')"/>
<!-- parse the actual XPath out of the xpath1() scheme -->
<!-- Note the attention to whitespace: we can't just use normalize-space() because the -->
<!-- XPath scheme itself we are parsing out may have whitespace in it -->
<xsl:variable name="xpath" select="replace( replace($fragID,'^xpath1\(\s*',''), '\s*\)\s*$','')"/>
<!-- make a copy of the current <certainty> element ... -->
<xsl:copy>
<!-- ... copy its attrs *except* target= -->
<xsl:apply-templates select="@*[ local-name(.) != 'target' ]"/>
<!-- ... if no base URI on input target=, then don't bother with output target= -->
<xsl:if test="normalize-space( $baseURI ) != '' ">
<!-- ... iff there was a base URI on the input target=, use that as -->
<!-- the output target= -->
<xsl:attribute name="target"><xsl:value-of select="$baseURI"/></xsl:attribute>
</xsl:if>
<!-- ... spit out the XPath we parsed out of the fragment identifier into an attr -->
<!-- of its own -->
<xsl:attribute name="notXSLT:match"><xsl:value-of select="$xpath"/></xsl:attribute>
<!-- ... copy over any content of <certainty> -->
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>