Subject: RE: Cleaning text away from context position ...
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Thu, 28 Jul 2005 11:39:19 +0100
|
I'd suggest instead of using position() to get the position of an element,
use <xsl:number/>.
You could in fact use <xsl:number level="multiple" count="*" format="1,1"/>
to get the whole value...
Michael Kay
http://www.saxonica.com/
> -----Original Message-----
> From: Soren Kuula [mailto:dongfang@xxxxxxxxxxx]
> Sent: 28 July 2005 10:39
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Cleaning text away from context position ...
>
> Hi,
>
> I'm toying with a stylesheet that copies an XML document ..
> and adds an
> attribute named id:
>
> For the root element, id is 1
> For some other element, id is that of the parent, plus ',' plus the
> child cardinality of the element (so first child of the root is 1,1,
> second child of the root is 1,2, second child of third child
> of the root
> is 1,3,2 etc).
>
> Something like:
> <?xml version='1.0'?>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
> <xsl:template match="*|@*|comment()|processing-instruction()">
> <xsl:param name="id" select="''"/>
> <xsl:param name="sep" select="''"/>
> <xsl:variable name="qid" select="concat($id, $sep, position())"/>
> <xsl:copy>
> <xsl:attribute name="id">
> <xsl:value-of select="$qid"/>
> </xsl:attribute>
> <xsl:apply-templates
> select="*|@*|comment()|processing-instruction()|text()">
> <xsl:with-param name="id" select="$qid"/>
> <xsl:with-param name="sep" select="','"/>
> </xsl:apply-templates>
> </xsl:copy>
> </xsl:template>
>
> Applying it to itself, I get
> <?xml version="1.0"?>
> <xsl:stylesheet
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform" id="1"
> version="1.0">
> <xsl:template id="1,5"
> match="*|@*|comment()|processing-instruction()">
> <xsl:param id="1,5,3" name="id" select="''"/>
> <xsl:param id="1,5,5" name="sep" select="''"/>
> <xsl:variable id="1,5,7" name="qid" select="concat($id, $sep,
> position())"/>
> <xsl:copy id="1,5,9">
> <xsl:attribute id="1,5,9,2" name="id">
> <xsl:value-of id="1,5,9,2,3" select="$qid"/>
> </xsl:attribute>
> <xsl:apply-templates id="1,5,9,4"
> select="*|@*|comment()|processing-instruction()|text()">
> <xsl:with-param id="1,5,9,4,3" name="id" select="$qid"/>
> <xsl:with-param id="1,5,9,4,5" name="sep" select="','"/>
> </xsl:apply-templates>
> </xsl:copy>
> </xsl:template>
> </xsl:stylesheet>
>
> - not quite what I wanted, as text nodes are included in the context
> list and affect context positions.
>
> What to do about it? I want to preserve text nodes. Seems I
> can't select
> and recurse on all element nodes and all text nodes
> separately (getting
> a nice context list of elements only), as that would mess up
> the order
> of things.
>
> Any good ideas? Need to recurse in the sibling direction instead?
>
> Soren
|