|
Subject: Re: [xsl] preceding axis is too permissive for my stylesheet From: "James A. Robinson" <jim.robinson@xxxxxxxxxxxx> Date: Sun, 01 Jun 2008 09:06:36 -0700 |
> <div1><!--Article-->
> <ptr target="ids.27.3.3fm" n="9"/>
> <ptr target="ids.27.3.4fm" n="10"/>
> <div2><!--Notes-->
> <ptr target="ids.27.3.3tm" n="1"/>
> <ptr target="ids.27.3.4tm" n="2"/>
> </div2>
> </div1>
> <test><ptr/></test>
>
> This not quite what I want. In the second <div1>, I want the first two
> @n values to be "1" and then "2", to match the markers in "Notes". The
So basically you want to renumber the @n value by the number of 'fm'
ptrs which occur along the ancestor axis and which precede the current
ptr?
If I understand what you're asking for, the ancestor axis paired with the
'<<' comparision operator might be one what do get the counts you want:
ancestor::*/ptr
[matches(@target, '([a-z]{3})\.([0-9]+)\.([0-9s]+)\.([0-9]+)fm')]
[. << current()]
For all ancestors which contain a ptr matching the 'fm' pattern, select
those matching ptr elements if they occur before the current context.
An example stylesheet (I used a few variables and keys to make it easier
for me to work with):
l:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tei="uri:some-made-up-namespace"
exclude-result-prefixes="tei xs">
<!-- regex to match ptr/@target -->
<xsl:variable name="tei:ptr-fm-regex" as="xs:string"
select="'([a-z]{3})\.([0-9]+)\.([0-9s]+)\.([0-9]+)fm'"/>
<xsl:variable name="tei:ptr-tm-regex" as="xs:string"
select="'([a-z]{3})\.([0-9]+)\.([0-9s]+)\.([0-9]+)tm'"/>
<!-- Locate ptr, with a @target matching $tei:ptr-fm-regex, by value @n -->
<xsl:key name="tei:ptr-fm-by-n" match="ptr[matches(@target, $tei:ptr-fm-regex)]" use="@n"/>
<!-- return a count of one + the number of fm ptr elements along the ancestor axis
which precede $ptr. -->
<xsl:function name="tei:ptr-fm-count">
<xsl:param name="ptr" as="element(ptr)"/>
<xsl:sequence select="1+count($ptr/ancestor::*/ptr[matches(@target, $tei:ptr-fm-regex)][. << $ptr])"/>
</xsl:function>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- For each 'fm' ptr, copy it, but replace @n with the tei:ptr-fm-count value -->
<xsl:template match="ptr[matches(@target, $tei:ptr-fm-regex)]">
<ptr target="{@target}" n="{tei:ptr-fm-count(.)}" />
</xsl:template>
<!-- For tm ptr elements look up the matching fm ptr by @n and return its
tei:ptr-fm-count. Of course, we're replacing @n now with non-unique
values, so this particular lookup won't be any good for our output
document. I'd have used @target, but that doesn't look to be unique. -->
<xsl:template match="ptr[matches(@target, $tei:ptr-tm-regex)]">
<ptr target="{@target}" n="{tei:ptr-fm-count(key('tei:ptr-fm-by-n', @n))}" />
</xsl:template>
</xsl:stylesheet>
Produces:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<div1><!--Article-->
<ptr target="ids.27.3.1fm" n="1"/>
<ptr target="ids.27.3.2fm" n="2"/>
<div2><!--Subsection-->
<ptr target="ids.27.3.3fm" n="3"/>
<ptr target="ids.27.3.4fm" n="4"/>
</div2>
<div2><!--Notes-->
<ptr target="ids.27.3.1tm" n="1"/>
<ptr target="ids.27.3.2tm" n="2"/>
<ptr target="ids.27.3.3tm" n="3"/>
<ptr target="ids.27.3.4tm" n="4"/>
</div2>
</div1>
<div1><!--Article-->
<ptr target="ids.27.3.3fm" n="1"/>
<ptr target="ids.27.3.4fm" n="2"/>
<div2><!--Notes-->
<ptr target="ids.27.3.3tm" n="1"/>
<ptr target="ids.27.3.4tm" n="2"/>
</div2>
</div1>
<test><ptr/></test>
</root>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
James A. Robinson jim.robinson@xxxxxxxxxxxx
Stanford University HighWire Press http://highwire.stanford.edu/
+1 650 7237294 (Work) +1 650 7259335 (Fax)
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| RE: [xsl] X3D XSLT, Michael Kay | Thread | Re: [xsl] preceding axis is too per, James A. Robinson |
| Re: [xsl] X3D XSLT, Florent Georges | Date | Re: [xsl] preceding axis is too per, James A. Robinson |
| Month |