Subject: Re: [xsl] Question about grouping attributes using keys From: "Mukul Gandhi" <gandhi.mukul@xxxxxxxxx> Date: Thu, 19 Apr 2007 22:03:02 +0530 |
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" version="1.0">
<xsl:key name="UNIQUE_ATTRS" match="ITEM" use="@ATTR" /> <xsl:key name="UNIQUE_ELEMS" match="ITEM" use="ELEM" />
<xsl:template match="/"> <xsl:call-template name="test"> <xsl:with-param name="theKey" select="'UNIQUE_ELEMS'"/> <xsl:with-param name="theName" select="'ELEM'"/> </xsl:call-template> <xsl:call-template name="test"> <xsl:with-param name="theKey" select="'UNIQUE_ATTRS'"/> <xsl:with-param name="theName" select="'ATTR'"/> </xsl:call-template> </xsl:template>
<xsl:template name="test"> <xsl:param name="theKey" select="." /> <xsl:param name="theName" select="." /> <p> <xsl:value-of select="concat('key: ', $theKey)" /><br/> <xsl:value-of select="concat('node: ', $theName)"/><br/> <xsl:text>values:</xsl:text> <xsl:variable name="rtf"> <xsl:for-each select="ROOT/ITEM[generate-id() = generate-id(key($theKey, ELEM)[1])]"> <xsl:value-of select="." /> </xsl:for-each> <xsl:for-each select="ROOT/ITEM[generate-id() = generate-id(key($theKey, @ATTR)[1])]"> <xsl:value-of select="@ATTR" /><xsl:text> </xsl:text> </xsl:for-each> </xsl:variable> <xsl:value-of select="msxsl:node-set($rtf)" /> </p> </xsl:template>
I'm trying to write a generic function to output a list of unique values on a selected node, whether it be an Element or Attribute. I've got the Element portion working fine, but Attributes don't seem to want to run through the for-each loop.... Here's a test which highlights this:
test.xml:
<?xml version="1.0" encoding="ISO8859-1" ?> <?xml-stylesheet type="text/xsl" href="test.xsl"?> <ROOT> <ITEM ATTR="A1"> <ELEM>E1</ELEM> </ITEM> <ITEM ATTR="A1"> <ELEM>E1</ELEM> </ITEM> <ITEM ATTR="A2"> <ELEM>E2</ELEM> </ITEM> <ITEM ATTR="A2"> <ELEM>E2</ELEM> </ITEM> <ITEM ATTR="A3"> <ELEM>E3</ELEM> </ITEM> <ITEM ATTR="A3"> <ELEM>E3</ELEM> </ITEM> </ROOT>
test.xsl:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html" /> <xsl:key name="UNIQUE_ATTRS" match="ITEM" use="@ATTR" /> <xsl:key name="UNIQUE_ELEMS" match="ITEM" use="ELEM" />
<xsl:template match="/"> <xsl:call-template name="test"> <xsl:with-param name="theKey" select="'UNIQUE_ELEMS'"/> <xsl:with-param name="theName" select="'ELEM'"/> </xsl:call-template> <xsl:call-template name="test"> <xsl:with-param name="theKey" select="'UNIQUE_ATTRS'"/> <xsl:with-param name="theName" select="'ATTR'"/> </xsl:call-template> </xsl:template>
<xsl:template name="test"> <xsl:param name="theKey" select="." /> <xsl:param name="theName" select="." /> <p> <xsl:value-of select="concat('key: ', $theKey)" /><br/> <xsl:value-of select="concat('node: ', $theName)" /><br/> <xsl:text>values:</xsl:text> <xsl:for-each select="ROOT/ITEM[ generate-id() = generate-id( key( $theKey, *[local-name()=$theName] ) [1] ) ]"> <xsl:value-of select="." /> </xsl:for-each> </p> </xsl:template> </xsl:stylesheet>
Opening "test.xml" returns:
key: UNIQUE_ELEMS node: ELEM values: E1 E2 E3
key: UNIQUE_ATTRS node: ATTR values:
Why is it that "A1 A2 A3" is not returned for the ATTR node? Is there any way to write a generic for-each select expression that takes the node name & key name and works for both elements and attributes? Any help is greatly appreciated
Thanks, -Tyler Waters
-- Regards, Mukul Gandhi
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Question about grouping attri, Waters, Tyler S FOR: | Thread | [xsl] RE: Question about grouping a, Waters, Tyler S FOR: |
[xsl] JSON Ingestion, Ingersoll, Utah | Date | Re: [xsl] Proposed syntax for names, Abel Braaksma |
Month |