Subject: RE: xsl:key containing mixed elements
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Sat, 23 Oct 2004 16:28:05 +0100
|
Your code works fine in Saxon. It reports:
Duplicate state name: standby
Duplicate state name: record
Duplicate state name: record
Duplicate state name: off
Duplicate state name: off
Duplicate state name: standby
Michael Kay
http://www.saxonica.com/
> -----Original Message-----
> From: George James [mailto:GeorgeJ@xxxxxxxxxxxxxxx]
> Sent: 23 October 2004 13:10
> To: 'xsl-list@xxxxxxxxxxxxxxxxxxxxxx'
> Subject: xsl:key containing mixed elements
>
> Hi
>
> I have a problem that I'm trying to solve using <xsl:key> but I'm not
> getting the results that I expected.
>
> It's probably best to explain first what I want to do and
> then show how I
> tried to use <xsl:key> to solve the problem.
>
> I have a file containing a mixture of <UML:SimpleState> and
> <UML:CompositeState> elements. Each one has a name
> attribute, but in the
> case of the <UML:CompositeState> element the name comprises
> of a state name
> followed by a colon followed by a sub-machine state name.
>
> What I want to do is simply read my file and report any
> duplicate state
> names.
>
> So, here's a simplified example of some of the data in my file:
>
> <UML:SimpleState name="on" />
> <UML:SimpleState name="off" />
> <UML:SimpleState name="off" />
> <UML:SimpleState name="standby" />
> <UML:CompositeState name="rewind:rewinding" />
> <UML:CompositeState name="forward:fastforwarding" />
> <UML:CompositeState name="standby:waiting" />
> <UML:CompositeState name="record:recording" />
> <UML:CompositeState name="record:recording" />
>
> I'd like to generate error messages for states 'off',
> 'standby' and 'record'
> because they are duplicates.
>
> This is how I tried to solve the problem. It works for the
> 'off' case but
> not for the 'standby' or the 'record' cases:
>
> <!-- Create an index containing the name of all simple states
> and the first part of the name of all composite states -->
> <xsl:key
> name="name"
> match="UML:CompositeState[@name]"
> use="substring-before(@name,':')" />
> <xsl:key
> name="name"
> match="UML:SimpleState[@name]"
> use="@name" />
>
> <xsl:template match='/'>
> <xsl:for-each select="//UML:CompositeState[@name]">
> <xsl:variable name='name' select="substring-before(@name,':')"/>
> <xsl:if test="count(key('name',$name))>1">
> <xsl:message>Duplicate state name: <xsl:value-of
> select='$name'/></xsl:message>
> </xsl:if>
> </xsl:for-each>
>
> <xsl:for-each select="//UML:SimpleState[@name]">
> <xsl:variable name='name' select="@name"/>
> <xsl:if test="count(key('name',$name))>1">
> <xsl:message>Duplicate state name: <xsl:value-of
> select='$name'/></xsl:message>
> </xsl:if>
> </xsl:for-each>
> </xsl:template>
>
> Can anyone enlighten me please?
>
> BTW I'm using xalan:
> Vendor: Apache Software Foundation
> Vendor URL: http://xml.apache.org/xalan-j
>
> D:\s>java -version
> java version "1.4.2_05"
> Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_05-b04)
> Java HotSpot(TM) Client VM (build 1.4.2_05-b04, mixed mode)
>
>
> Regards
> George
>
> George James Software
> Cachi Tools, Training, Technology
> www.georgejames.com
> +44-1932-252568
|