xsl-list
[Top] [All Lists]

Re: [xsl] Troublshooting XSLT replace()

2013-12-03 10:13:24
On 03/12/2013 15:52, Nathan Tallman wrote:
I'm glad my last query produced some mirth. I've got another today.

The "Undate" and "Circa" modes do not work in the following stylesheet
and I can't figure out why. Can someone please point out my errors?

Many thanks,
Nathan

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
     <xsl:output method="xml"
         doctype-public="+//ISBN 1-931666-00-8//DTD ead.dtd (Encoded
Archival Description (EAD) Version 2002)//EN"
         doctype-system="ead.dtd" indent="yes"/>
     <xsl:variable name="vAllowedSymbols"
         select="'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
-.'"/>
     <xsl:template match="* | processing-instruction() | comment()">
         <xsl:copy>
             <xsl:copy-of select="@*"/>
             <xsl:apply-templates/>
         </xsl:copy>
     </xsl:template>
     <xsl:template match="*/text()">
         <xsl:variable name="phase1">
             <xsl:apply-templates select="." mode="Punctuation"/>
         </xsl:variable>


so $phase1 is a root node with a single text child, being the result of the regexp replace?

You might have done
  <xsl:variable name="phase1" select="replace(., '(^.*)\p{P}$', '$1')"/>
which would have been clearer if that is the only template, but then $phase1 would be a string/


so this
  <xsl:apply-templates select="$phase1" mode="Undate"/>
applies templates to a / node but the only template you have in that mode is unitdate/text() which never matches as, as noted above
you have no element nodes, just  / with child a text node.



         <xsl:variable name="phase2">
             <xsl:apply-templates select="$phase1" mode="Undate"/>
         </xsl:variable>
         <xsl:variable name="phase3">
             <xsl:apply-templates select="$phase2" mode="Circa"/>
         </xsl:variable>
         <xsl:apply-templates select="$phase3" mode="Extent"/>
     </xsl:template>
     <xsl:template
         match="unittitle/text()[matches(., '^.*\p{P}$')] |
unittitle/title/text()[matches(., '^.*\p{P}$')] |
unitdate/text()[matches(., '^.*\p{P}$')]"
         mode="Punctuation">
         <xsl:sequence select="replace(., '(^.*)\p{P}$', '$1')"/>
     </xsl:template>
     <xsl:template match="unitdate/text()" mode="Undate">
         <xsl:sequence select="replace(., 'Undated','undated')"/>
     </xsl:template>
     <xsl:template match="unitdate/text()" mode="Circa">
         <xsl:sequence select="replace(., 'Circa','circa')"/>
     </xsl:template>
     <xsl:template match="physdesc/extent/text()" mode="Extent">
         <xsl:value-of select="translate(.,translate(.,
$vAllowedSymbols, ''),'')"/>
     </xsl:template>
     <xsl:template match="unittitle[not(string(.))]"> </xsl:template>
</xsl:stylesheet>

David



________________________________________________________________________
The Numerical Algorithms Group Ltd is a company registered in England
and Wales with company number 1249803. The registered office is:
Wilkinson House, Jordan Hill Road, Oxford OX2 8DR, United Kingdom.

This e-mail has been scanned for all viruses by Star. The service is
powered by MessageLabs. ________________________________________________________________________

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--