xsl-list
[Top] [All Lists]

Re: [xsl] Correcting a prior error

2010-07-30 04:00:46
I think you're out by one: the outermost element will have

count(ancestor::*|preceding::*)

equal to 0, but can be retrieved as (.//*)[1].

I think I would use

<xsl:key name="p" match="*">
<xsl:number level="any" count="*" from="/"/>
</xsl:key>

then

<xsl:variable name="posn">
  <xsl:number level="any" count="*" from="/"/>
</xsl:variable>

<xsl:variable name="val" select="document($src)/key('p', $posn)"/>


Michael Kay
Saxonica


On 30/07/2010 09:44, Dave Pawson wrote:
I've been working with a series of xhtml like files, cleaning them up.
It was a case of run an identity tranform, apply corrections.
That was the theory.
Luckily I kept a backup.
I hastily created an incorrect version of the identity transform
which omitted to copy the contents of any attributes.

I'm left with the problem of how to correct it.
Given
directory A contains the files to be corrected.
directory B contains the backup set of files.

I want to match on
"x:a[not(string(@href))]" I.e. those a elements with an empty href
attribute.

then copy across the value of the 'matching' href in the B directory,
same file. I'm iterating through the files in A using

  <xsl:for-each select="for $f in collection('/A?select=*.xml')
                          return $f">
  <xsl:result-document
        href="{replace(base-uri(),'A','AA')}">
        <xsl:apply-templates/>
    </xsl:result-document>
which creates the temporary directory AA with the corrections applied.


the problem I'm finding is picking up the correct a element in
the second file?

Having found an empty a element

I'm trying
  <xsl:variable name="backup" select="'file:///B'"/>

   <xsl:template match="x:a[not(@href)]">
     <xsl:variable name="thisdoc" select="document-uri(/)"/>
     <xsl:variable name="base"
select="substring-after($thisdoc,'blg/')"/>
     <xsl:variable name="src" select="concat($backup,'/',$base)"
as="xs:string"/>   <!- this is the basename of the filename being worked
->

<-this is an attempt to select the 'right' a element->
     <xsl:variable name="posn" select="count(ancestor::*|preceding::*)"/>
     <xsl:variable name="val"
       select="(document($src)//*)[$posn]/@href"/>


     <!-- Now copy this across -->
     <x:a href="{$val}">
       <xsl:value-of select="."/>
     </x:a>
   </xsl:template>


Can anyone spot any obvious sillies please?


regards
------------------------
Dave Pawson
http://www.dpawson.co.uk
XSLT, XSL-FO and docbook FAQ





--~------------------------------------------------------------------
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>
--~--