Subject: Re: [xsl] Muenchian grouping: help with 'use' and multiple elements From: Mukul Gandhi <mukul_gandhi@xxxxxxxxx> Date: Sat, 10 Jul 2004 04:00:11 -0700 (PDT) |
Hi Justin, Please just modify the 1st line of stylesheet with - <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xalan" exclude-result-prefixes="xalan"> This will cause xmlns:xalan="http://xml.apache.org/xalan" not to be generated in the output. Regards, Mukul --- Mukul Gandhi <mukul_gandhi@xxxxxxxxx> wrote: > Hi Justin, > Please try the XSL - > > <?xml version="1.0" encoding="UTF-8"?> > <xsl:stylesheet version="1.0" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > xmlns:xalan="http://xml.apache.org/xalan"> > > <xsl:output method="xml" version="1.0" > encoding="UTF-8" indent="yes"/> > > <xsl:key name="by-restr" match="r_ele" use="restr" > /> > > <xsl:template match="/entry"> > <entry> > <xsl:variable name="rtf"> > <xsl:for-each select="r_ele"> > <r_ele> > <reb> > <xsl:value-of select="reb"/> > </reb> > <restr> > <xsl:for-each select="re_restr"> > <xsl:sort select="."/> > <xsl:value-of select="."/> > <xsl:if test="position() != last()"> > <xsl:text>,</xsl:text> > </xsl:if> > </xsl:for-each> > </restr> > </r_ele> > </xsl:for-each> > </xsl:variable> > > <xsl:for-each > select="xalan:nodeset($rtf)/r_ele"> > <xsl:if test="generate-id(.) = > generate-id(key('by-restr', restr)[1])"> > <group> > <rebs> > <xsl:for-each select="key('by-restr', > restr)"> > <reb> > <xsl:value-of > select="reb" /> > </reb> > </xsl:for-each> > </rebs> > <re_restrs> > <xsl:if test="restr != '' "> > <xsl:call-template > name="tokenise-restr"> > <xsl:with-param name="str" > select="restr" /> > > <xsl:with-param name="delim" > select="','" /> > > > </xsl:call-template> > </xsl:if> > </re_restrs> > </group> > </xsl:if> > </xsl:for-each> > </entry> > > </xsl:template> > > <xsl:template name="tokenise-restr"> > <xsl:param name="str" /> > <xsl:param name="delim" /> > > <xsl:if test="not(contains($str, $delim))"> > <re_restr> > <xsl:value-of select="$str" /> > </re_restr> > </xsl:if> > <xsl:if test="substring-after($str, $delim) != '' > "> > <re_restr> > <xsl:value-of select="substring-before($str, > $delim)" /> > </re_restr> > <xsl:call-template name="tokenise-restr"> > <xsl:with-param name="str" > select="substring-after($str, $delim)" /> > <xsl:with-param name="delim" select="$delim" > /> > </xsl:call-template> > </xsl:if> > </xsl:template> > > </xsl:stylesheet> > > Regards, > Mukul > > --- Justin Anderson <justin_anderson@xxxxxxx> wrote: > > I'll start this off by mentioning that I started > to > > learning XSLT a > > week ago, so please don't be too harsh with me if > > the answer to this > > question is obvious. > > > > A description of the source and the desired output > > in plain english: > > > > The xml file I'm using is an Asian dictionary in > > which different > > pronounciations (reb) are limited to specific > > characters (re_restr). > > Sometimes certain pronounciations have the same > set > > of restrictions. In > > those cases, I'd like to group them together. I > made > > a dummy entry > > below based on numbers. 12 and 21 both contain > 'one' > > and 'two', so they > > should be grouped together. That's what I'm trying > > to do. > > > > I'm trying to do single-level Muenchian grouping > of > > r_ele elements by > > their re_restr children, of which there can be 0 > to > > infinity instances > > in any order. I'm not sure if Muenchian grouping > > works when the 'use' > > element doesn't exist all the time, and I have no > > clue how to make the > > 'use' element consider all of the re_restr > children > > in an r_ele at the > > same time. > > > > I've included a sample of the xml source file, the > > xsl file (which I'm > > pretty sure isn't anything like I need it to be), > > the desired xml > > output, and the actual xml output. > > > > Thanks in advance for any light shed on this, > > Justin Anderson > > > > > > XML source file: > > > > <?xml version="1.0" encoding="UTF-8"?> > > <entry> > > <k_ele> > > <keb>one</keb> > > </k_ele> > > <k_ele> > > <keb>two</keb> > > </k_ele> > > <k_ele> > > <keb>three</keb> > > </k_ele> > > <r_ele> > > <reb>12</reb> > > <re_restr>one</re_restr> > > <re_restr>two</re_restr> > > </r_ele> > > <r_ele> > > <reb>32</reb> > > <re_restr>two</re_restr> > > <re_restr>three</re_restr> > > </r_ele> > > <r_ele> > > <reb>21</reb> > > <re_restr>two</re_restr> > > <re_restr>one</re_restr> > > </r_ele> > > </entry> > > > > XSL file: > > > > <?xml version='1.0' encoding='utf-8' ?> > > <xsl:stylesheet > > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > > > version="1.0"> > > <xsl:output method="xml"/> > > > > <xsl:key name="r_ele-by-re_restr" match="r_ele" > > use="re_restr"/> > > > > <xsl:template match="/"> > > <xsl:apply-templates/> > > </xsl:template> > > > > <xsl:template match="entry"> > > <entry> > > <xsl:for-each > > > select="r_ele[generate-id(.)=generate-id(key('r_ele-by- > > > > re_restr',re_restr))]"> > > <xsl:sort select="reb" order="ascending"/> > > <group> > > <xsl:for-each > > select="key('r_ele-by-re_restr',re_restr)"> > > <xsl:sort select="reb"/> > > <rebs> > > <reb> > > <xsl:value-of select="reb"/> > > </reb> > > </rebs> > > <re_restrs> > > <xsl:for-each select="re_restr"> > > <xsl:sort select="." order="ascending" /> > > <re_restr> > > <xsl:value-of select="."/> > > </re_restr> > > </xsl:for-each> > > </re_restrs> > > </xsl:for-each> > > </group> > > </xsl:for-each> > > </entry> > > </xsl:template> > > > > </xsl:stylesheet> > > > > > > Desired results: > > > > <entry> > > <group> > > <rebs> > > <reb>12</reb> > > <reb>21</reb> > > </rebs> > > <re_restrs> > > <re_restr>one</re_restr> > > <re_restr>two</re_restr> > > </re_restrs> > > </group> > > <group> > > <rebs> > > <reb>32</reb> > > </rebs> > > <re_restrs> > > <re_restr>two</re_restr> > > <re_restr>three</re_restr> > > </re_restrs> > > </group> > > </entry> > > > > Current actual results: > > > > <entry> > > <group> > > <rebs> > > <reb>12</reb> > > </rebs> > > <re_restrs> > > <re_restr>one</re_restr> > > <re_restr>two</re_restr> > > </re_restrs> > > </group> > > <group> > > <rebs> > > <reb>21</reb> > > </rebs> > > <re_restrs> > > <re_restr>one</re_restr> > > <re_restr>two</re_restr> > > </re_restrs> > > </group> > > <group> > > <rebs> > > <reb>32</reb> > > </rebs> > > <re_restrs> > > <re_restr>two</re_restr> > > <re_restr>three</re_restr> > > </re_restrs> > > </group> > > </entry> __________________________________ Do you Yahoo!? New and Improved Yahoo! Mail - Send 10MB messages! http://promotions.yahoo.com/new_mail
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Muenchian grouping: help , Mukul Gandhi | Thread | [xsl] Re: [exslt] RE: another error, Jeni Tennison |
Re: [xsl] Muenchian grouping: help , Mukul Gandhi | Date | Re: [xsl] finding position in list , David Carlisle |
Month |