Subject: Re: Unique id based on the position
From: Gábor Tóth <roysy@xxxxxxxx>
Date: Wed, 10 Nov 2010 13:42:52 +0000
|
Indeed, you are right, I fixed it, thanks a lot, Michael.
On Wed, Nov 10, 2010 at 10:45 AM, Michael Kay <mike@xxxxxxxxxxxx> wrote:
> I can't exactly work out your requirements from this, but it looks to me as
> if the third component of the number should use xsl:number level="any"
> rather than level="single".
>
> Michael Kay
> Saxonica
>
> On 10/11/2010 09:58, Gabor Tsth wrote:
>>
>> Dear All,
>>
>> I wish to give a unique ID to an element (seg) based on his position
>> within another element. The unique id should be the position of the
>> div1, p and seg element. The problem is when the seg element is not
>> the direct child of p element, then the xsl:number from function
>> restarts the numbering. See the exact problem below in the comment of
>> the output , sorry but I am not able to explain it very well.
>>
>> Thanks a lot,
>>
>> Gabor
>>
>> The XML fiile is this:
>>
>>
>> <?xml-stylesheet type="text/xsl" href="IDGeneratingTest1NONAMESPACE.xsl"?>
>>
>> <text>
>> <body>
>> <div1 xml:id="ch.2" corresp="#toc.2">
>> <p>
>> <seg ID=" ">econdariamente</seg>
>> <seg ID=" ">Pandolfo</seg>
>> <seg ID=" ">et</seg>
>> <list>
>> <item>
>> <seg ID=" ">Bernardo</seg>
>> <seg ID=" ">miei</seg>
>> </item>
>> </list>
>> <seg ID=" ">figli</seg>
>> </p>
>>
>> <p>
>> <seg ID=" ">gli</seg>
>> <unclear>
>> <seg ID=" ">fermiate</seg>
>> <seg ID=" ">domandate</seg>
>> </unclear>
>> <seg ID=" ">prima</seg>
>> <seg ID=" ">diligentemente</seg>
>>
>> </p>
>> </div1>
>> </body>
>> </text>
>>
>> The stylesheet that I am using is this:
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>> version="2.0">
>>
>> <xsl:template match="@*|node()|comment()|processing-instruction()"
>> priority="-5">
>> <xsl:copy>
>> <xsl:apply-templates
>> select="@*|node()|comment()|processing-instruction()"/>
>> </xsl:copy>
>> <xsl:apply-templates select="//text/body/p//seg"/>
>> </xsl:template>
>>
>> <xsl:template match="@ID">
>> <xsl:attribute name="xml:id">
>>
>> <xsl:for-each
>> select="ancestor::seg/ancestor::p/ancestor::div1">
>> <xsl:number from="//text/body"/>.</xsl:for-each>
>>
>> <xsl:for-each select="ancestor::seg/ancestor::p">
>> <xsl:number from="//text/body/div1"/>.</xsl:for-each>
>>
>> <xsl:for-each select="ancestor::seg">
>> <xsl:number from="//text/body/div1/p"/>
>> </xsl:for-each>
>>
>> </xsl:attribute>
>>
>> </xsl:template>
>> </xsl:stylesheet>
>>
>>
>> Output:
>>
>> <?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl"
>> href="IDGeneratingTest1NONAMESPACE.xsl"?>
>> <text>
>> <body>
>> <div1 xml:id="ch.2" corresp="#toc.2">
>> <p>
>> <seg xml:id="1.1.1">econdariamente</seg>
>> <seg xml:id="1.1.2">Pandolfo</seg>
>> <seg xml:id="1.1.3">et</seg>
>> <list>
>>
>> <item>
>> <seg xml:id="1.1.1">Bernardo</seg>
>>
>> <!-- I don't want that the numbering restarts
>> here, I wish to count the seg
>> elements from the p element, so ideally,
>> here the xml:id should be 1.1.4, and then 1.1.5 but I I see
>> what is the problem but I don't find the
>> trick.-->
>>
>> <seg xml:id="1.1.2">miei</seg>
>> </item>
>> </list>
>> <seg xml:id="1.1.4">figli</seg>
>> </p>
>>
>>
>> <p>
>> <seg xml:id="1.2.1">gli</seg>
>> <unclear>
>> <seg xml:id="1.2.1">fermiate</seg>
>>
>> <!-- The problem is again the same, the xml:id
>> should 1.2.2-->
>>
>> <seg xml:id="1.2.2">domandate</seg>
>> </unclear>
>> <seg xml:id="1.2.2">prima</seg>
>>
>> <seg xml:id="1.2.3">diligentemente</seg>
>>
>> </p>
>> </div1>
>> </body>
>> </text>
|