Altova Mailing List Archives


Re: [xsl] numbering and sorting compatibility issue

From: "Andrew" <asd@---------->
To:
Date: 3/22/2003 3:46:00 AM
OK I'll be more concrete,
I've following structure
<Report>
<Manufacturing m_no="1">
    <Order code="x">
        <Equipment name="y">
            <Element part="z" qty="3"/>
            <Element part="z" qty="4"/>
            ...
        </Equipment>
        <Equip...
    </Order>
    <Order...
</Manufacturing>
<Manufact...
</Report>
I think self describing...
and I want to represent it in table form
<table>
    <tr><td>Manufacturing No. <xsl:value-of select="@m_no"/></td></tr>
    <tr><td style="padding-left:10px">Order <xsl:value-of
select="@code"/></td></tr>
    <tr><td style="padding-left:20px" colspan="*">Equipment <xsl:value-of
select="@name"/></td></tr>
    <tr><td>Pos No <xsl:value-of select="?"/></td><td
style="padding-left:30px">Element </td><td><xsl:value-of
select="@qty"/></td></tr>
    ...
    <tr><td style="padding-left:10px">Order <xsl:value-of
select="@code"/></td></tr>
    <tr><td style="padding-left:20px" colspan="*">Equipment <xsl:value-of
select="@name"/></td></tr>
    ...
    <tr><td style="padding-left:20px" colspan="*">Equipment <xsl:value-of
select="@name"/></td></tr>
    <tr><td>Pos No <xsl:value-of select="?"/></td><td
style="padding-left:30px">Element </td><td><xsl:value-of
select="@qty"/></td></tr>
   ...
</table>
so I need to sort Elements by "part" AND number through all "Report" but I
do numbering in "Equipment" context/template so...
If I use position() I've got "in Equipment" numbering not all "Report" but
when I use <xsl:number level="any"/> I've got "random" position numbering
because Elements in Equipment not ordered by part_no.

Thanks.
P.S.Anyway that's better that CrystalReports ;-)

----- Original Message ----- 
From: "Jeni Tennison" <jeni@xxxxxxxxxxxxxxxx>
To: "Andrew" <asd@xxxxxxxxxx>
Cc: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
Sent: Saturday, March 22, 2003 3:34 PM
Subject: Re: [xsl] numbering and sorting compatibility issue


> Hi Andrew,
>
> > How I can change priority for <xsl:number/> for correct
> > numbering+sorting? By default first xsl processor does numbering and
> > after that sorting.
>
> <xsl:number> *always* gives you a number that's based on the position
> of the node in the source tree. To get a number that's based on the
> order in which the nodes are processed, you should use the position()
> function.
>
> > It's so confusing for "multilevel" numbering as for xml:
> > <Lev1>
> >     <Lev2>
> >         <Lev3 x="y"/>
> >     </Lev2>
> >     <Lev2>
> >         <Lev3 x="z"/>
> >     </Lev2>
> >     ...
> > </Lev1>
> > xsl:
> > <template select="Lev1">
> >     <apply-templates/>
> > </template>
> > <template select="Lev2">
> >     <apply-templates>
> >         <sort select="@x"/>
> >     </apply-templates>
> > </template>
> > <template select="Lev3">
> >     <tr>
> >         <td><xsl:number level="any"/></td>
> >         <td>...</td>
> >     </tr>
> > </template>
> <
> > so I want to number "Lev3" through all document and sort "Lev3" on
> > "Lev2" by "x". How I can acomplish this?
>
> I's a bit hard to tell what you're aiming for without seeing the
> output that you want. In particular, the XSLT code that you're using
> is applying templates to the <Lev3> elements within a particular
> <Lev2> in order of their x attribute, but in your example XML there's
> only one <Lev3> element within each <Lev2> element, so the sort
> wouldn't have any effect.
>
> I suspect that you want to apply templates to all the <Lev3> elements
> (across the document, sorted in order of their x attribute. In which
> case, I'd use:
>
> <xsl:template match="Lev1">
>   <xsl:for-each select="Lev2/Lev3">
>     <xsl:sort select="@x" />
>     <tr>
>       <td><xsl:value-of select="position()" /></td>
>       <td>...</td>
>     </tr>
>   </xsl:for-each>
> </xsl:template>
>
> (I generally use <xsl:for-each> rather than <xsl:apply-templates> when
> the position() function is used, because the output is effected by
> exactly which nodes are selected and what order they're processed, so
> it's useful to keep the two together.)
>
> If you really have several <Lev3> elements within each <Lev2> element,
> and you only want the sort to effect the <Lev3> elements within the
> same <Lev2> elements, then numbering is more complicated: you have to
> add the position() (in sorted order) to the number of <Lev3> elements
> within the <Lev2> elements that precede this <Lev3> element's parent
> <Lev2> element. The XPath would be:
>
>   position() + count(../preceding-sibling::Lev2/Lev3)
>
> Cheers,
>
> Jeni
>
> ---
> Jeni Tennison
> http://www.jenitennison.com/
>
>
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
>
>


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list

Disclaimer

These Archives are provided for informational purposes only and have been generated directly from the Altova mailing list archive system and are comprised of the lists set forth on www.altova.com/list/index.html. Therefore, Altova does not warrant or guarantee the accuracy, reliability, completeness, usefulness, non-infringement of intellectual property rights, or quality of any content on the Altova Mailing List Archive(s), regardless of who originates that content. You expressly understand and agree that you bear all risks associated with using or relying on that content. Altova will not be liable or responsible in any way for any content posted including, but not limited to, any errors or omissions in content, or for any losses or damage of any kind incurred as a result of the use of or reliance on any content. This disclaimer and limitation on liability is in addition to the disclaimers and limitations contained in the Website Terms of Use and elsewhere on the site.