RE: [xsl] generating ID strings that are both readable and unique

Subject: RE: [xsl] generating ID strings that are both readable and unique
From: "Trevor Nicholls" <trevor@xxxxxxxxxxxxxxxxxx>
Date: Tue, 14 Oct 2008 22:11:58 +1300
David

It isn't available in XSL 1 because the key is constructed from the 'use'
expression and a more complex either-or-or- construction is only possible in
XSL 2.

You've got the solution I was trying to work towards which deals with
potential duplicated section titles. But what it doesn't deal with is
sections which already have id attributes defined. True, it avoids
generating a new id for these sections, but it doesn't detect the situation
where the id attached to one of these sections happens to duplicate the new
id that this code will generate for one of the other sections. That's why it
appears to me that I need a more complex key.

I am unable to modify id's that have already been defined - these id's exist
because the documents already contain a certain number of cross references.

The stylesheet runs in the middle of Frame's save dialog. Aborting the
transform with a duplicate id would be a catastrophe.

Cheers
Trevor

-----Original Message-----
From: David Carlisle [mailto:davidc@xxxxxxxxx] 
Sent: Tuesday, 14 October 2008 9:59 p.m.
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: [xsl] generating ID strings that are both readable and unique



me> >  However this mechanism isn't possible in XSL 1.0
me> 
me> why not?




something like the following.
You'd need to fine tune the set of characters made safe (this makes
spaces into _ and discards !#,( but lets anything else through, and
doesn't take care to avoid digits etc being at the front of the id
but all those are probably fixable in practice.

David


<x>

  <section><title>Introduction with spaces!</title>...</section>
  ...
  <section id="examples"><title>Examples</title>...</section>
  <section><title>Examples</title>...</section>
  ...
  <section><title>Introduction with spaces!</title>...</section>
  <section id="foo"><title>og jhl</title>...</section>
  <section><title>og jhl</title>...</section>
  <section><title>og jhl</title>...</section>
  ...
</x>



<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
 

 <xsl:template match="node()">
  <xsl:copy>
   <xsl:copy-of select="@*"/>
   <xsl:apply-templates/>
  </xsl:copy>
 </xsl:template>



 <xsl:key name="noid" match="section[not(@id)]" use="translate(title,'
!#,()','_')"/>
 <xsl:template match="section[not(@id)]">
   <xsl:copy>
    <xsl:variable name="id" select="translate(title,' !#._,()','_')"/>
    <xsl:variable name="thisnode" select="generate-id()"/>
    <xsl:attribute name="id">
     <xsl:value-of select="$id"/>
     <xsl:for-each select="key('noid',$id)">
      <xsl:if test="position()!=1 and generate-id(.)=$thisnode">
       <xsl:text>-</xsl:text>
       <xsl:value-of select="position()"/>
      </xsl:if>
     </xsl:for-each>
    </xsl:attribute>
   <xsl:copy-of select="@*"/>
   <xsl:apply-templates/>
  </xsl:copy>
 </xsl:template>

</xsl:stylesheet>




$ saxon ids.xml ids.xsl
<?xml version="1.0" encoding="utf-8"?><x>

  <section id="Introduction_with_spaces"><title>Introduction with
spaces!</title>...</section>
  ...
  <section id="examples"><title>Examples</title>...</section>
  <section id="Examples"><title>Examples</title>...</section>
  ...
  <section id="Introduction_with_spaces-2"><title>Introduction with
spaces!</title>...</section>
  <section id="foo"><title>og jhl</title>...</section>
  <section id="og_jhl"><title>og jhl</title>...</section>
  <section id="og_jhl-2"><title>og jhl</title>...</section>
  ...
</x>

________________________________________________________________________
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. 
________________________________________________________________________

Current Thread