Subject: RE: [xsl] How do can I select distinct nodes and adding a counter at the sa me time From: TSchutzerWeissmann@xxxxxxxxxxxxxxxx Date: Wed, 27 Nov 2002 16:30:36 -0000 |
Hello Cams, You'll have to exclude any nodes that already occur in the first file: This concatenates the text value and the xxxx/@att value and sees if it occurs as an @oid value in the first file. <xsl:apply-templates select="xxx[ (not (contains(concat(.,'||',xxxx/@*), $first/mapping/@oid)) and (generate-id() = generate-id(key('distinctlyXXX', self::xxx[not(xxxx/@*)]|xxxx/@*))) )]"/> You'll need to change the bits relating to the first file, to reflect its structure: <xsl:variable name="first_path" select="'first.xml'"/> <xsl:variable name="first" select="document($first_path)/root"/> <xsl:variable name="first_count_maps" select="count($first/mapping)"/> hth Tom > -----Original Message----- > From: Cams Ismael [mailto:Ismael.Cams@xxxxxxxxxxxxxxx] > Sent: 27 November 2002 15:18 > To: 'xsl-list@xxxxxxxxxxxxxxxxxxxxxx' > Subject: RE: [xsl] How do can I select distinct nodes and adding a > counter at the sa me time > > > Hello, > > I have been already helped a lot by this solution. However again I > encountered a problem for which I don't see a solution > immediately. What I > need now is a mechanism to determine if the xxx value or att1 > attribute is > already in the first xml file. When already available this > node should not > be count. So what I want to do is the next: > > first file: > > <root> > <mapping oid=".1.5.3.2" id="1"/> > <mapping oid=".1.5.3.4.5" id="3"/> > </root> > > second file: > <xx> > <xxx>.1.5.6.3.8 > <xxxx att1=".1.5.6.3.8"/> > <xxx> > <xxx>.1.5.6.3.10 > <xxxx att2="1.5.3.4.5"/> > <xxx> > <xxx>.1.5.6.4.5</xxx> > </xx> > > result file should be: > <root> > <mapping oid=".1.5.3.2" id="1"/> > <mapping oid=".1.5.3.4.5" id="3"/> > <mapping oid=".1.5.3.4.8" id="5"/> > <mapping oid=".1.5.6.4.5" id="7"/> > </root> > > The solution I have now gives the following result: > <root> > <mapping oid=".1.5.3.2" id="1"/> > <mapping oid=".1.5.3.4.5" id="3"/> > <mapping oid=".1.5.3.4.8" id="5"/> > <mapping oid=".1.5.6.4.5" id="9"/> <!--This id should be > 7--> > </root> > > The stylesheet I use select all distinct values with use of the Muench > method. Than I check if the value was already available in > the first file. > What I actually need is a selection of all distinct nodes > that don't already > exist in the first file. If all this information was in one > file I think I > could handle it, but no two files are used and I don't see directly a > solution for this. Hopefully someone can help me with this again ? > > Thanks in advance. > > Kind regards, > Ismaël > > -----Original Message----- > From: TSchutzerWeissmann@xxxxxxxxxxxxxxxx > [mailto:TSchutzerWeissmann@xxxxxxxxxxxxxxxx] > Sent: vrijdag 22 november 2002 16:59 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: RE: [xsl] How do can I select distinct nodes and adding a > counter at the sa me time > > > Dear Ismaël > > >I know what you mean, but the problem I have is how do I > produce a tree > with > >distinct values that I can access afterwards. > > This is essentially a grouping problem. You can use xsl:key to group > elements according to a particular value. This will allow you > to access the > distinct values as a nodeset, without having to put them in a > variable and > use an extension function. > > [from your first email] > > > The second one looks like this: > > > > <xx> > > <xxx>.1.5.6.3.8 > > <xxxx att1=".1.5.6.3.8"/> > > <xxx> > > <xxx>.1.5.6.3.10 > > <xxxx att2="1.5.6.3.9"/> > > <xxx> > > <xxx>.1.5.6.4.5</xxx> > > </xx> > [...] > > What I want to do know is getting out of the second xml file the > > values of the attributes mapped onto an odd number (5,7,9) when this > > attribute is available. When not available the text value > of the tag must > be > > used. > > The only hard bit is setting up the key so that it ignores > the text value of > the xxx tag if there's an xxxx child with an attribute. > > <xsl:key name="distinctlyXXX" match="xxx" > use="self::xxx[not(xxxx/@*)]|xxxx/@*"/> > > <!-- group on the xxxx child's first attribute, if it exists, > otherwise on the text value of xxx --> > > <xsl:variable name="first_path" select="firstFile.xml"/> > <xsl:variable name="first" select="document($first_path)"/> > <xsl:variable name="first_count_maps" > select="count($first/mapping/map)"/> > > <xsl:template match="xx"> > <mapping> > <xsl:copy-of select="$first/mapping/map"/> > <xsl:apply-templates > select="xxx[generate-id() = generate-id(key('distinctlyXXX', > self::xxx[not(xxxx/@*)]|xxxx/@*))]"/> > <!-- this is classic Muenchian grouping --> > </mapping> > </xsl:template> > > <xsl:template match="xxx"> > <map oid="{string(self::xxx[not(xxxx/@*)] | xxxx/@*)}" > id="{(position() + $first_map_count) * 2 - 1}"> > <xsl:value-of select=". | xxxx/@*"/> > </map> > </xsl:template> > > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list > > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] How do can I select disti, Cams Ismael | Thread | [xsl] Re: string processing, Dimitre Novatchev |
Re: [xsl] monotonous nbsp coding, Vasu Chakkera | Date | [xsl] Xalan Extension Parameter, Paul Brady |
Month |