Subject: [xsl] Sort Question From: "Simon, Jb" <jb.simon@xxxxxxxx> Date: Wed, 01 Jun 2005 17:22:20 -0400 |
Hi Sorry this is so long, I am trying to sort the enumerated values of a type, To generate C code from an XML document. Given the following XML file... <?xml version="1.0" encoding="UTF-8"?> <dataroot xmlns:od="urn:schemas-microsoft-com:officedata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="irs.xsd" generated="2005-06-01T11:26:34"> <tblEnumeratedTypes_WC> <EnumeratedType>ColorType</EnumeratedType> <tblEnumValues_WC> <EnumeratedType>ColorType</EnumeratedType> <EnumValue>1</EnumValue> <EnumValueDescription>Red</EnumValueDescription> </tblEnumValues_WC> <tblEnumValues_WC> <EnumeratedType>ColorType</EnumeratedType> <EnumValue>8</EnumValue> <EnumValueDescription>White</EnumValueDescription> </tblEnumValues_WC> <tblEnumValues_WC> <EnumeratedType>ColorType</EnumeratedType> <EnumValue>3</EnumValue> <EnumValueDescription>Blue</EnumValueDescription> </tblEnumValues_WC> </tblEnumeratedTypes_WC> </dataroot> I get these retults : //---------------------------------------------------------------------- ---------------- //---------------------------------------------------------------------- ---------------- // Enumerated Types //---------------------------------------------------------------------- ---------------- //---------------------------------------------------------------------- ---------------- //---------------------------------------------------------------------- ---------------- // Name : ColorType // Description : //---------------------------------------------------------------------- ---------------- enum { ColorTypeRed = 1, Blue = 3, White = 8 } ; RANGE_TYPE ( UINT8, ColorType, Red, Blue ) ; XSL File used is at the end of this document. Problems : The first element ColorTypeRed should be simply Red. I can't figure out why the ColorType is being injected here. If I remove the sort I get the correct structure (in the wrong order). Next, the Range_Type should be RANGE_TYPE ( UINT8, ColorType, Red, White ) ; I can't for the life of me figure out how to restucture the template <xsl:template match="tblEnumeratedTypes_WC" mode="range-macro"> To make it use the sorted list. Thanks in Advance, Joe Simon After Applying the following XSL <?xml version="1.0" encoding="ISO-8859-1"?> <?altova_sps C:\Documents and Settings\simonj\My Documents\us101\xml\Messages.sps?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:strip-space elements="*"/> <xsl:param name="file" select=" 'MESSAGES.h' "/> <xsl:variable name="assignment" select=" ' = ' "/> <xsl:variable name="terminator" select=" ' ;' "/> <xsl:template match="dataroot"> <xsl:apply-templates select="node()"/> </xsl:template> <!-- --> <!-- This template matches an Enumerated Type --> <!-- --> <!-- It creates a header for the type and then --> <!-- creates the C struct. --> <!-- --> <xsl:template match="tblEnumeratedTypes_WC" priority="1"> <xsl:choose> <xsl:when test="1=position()"> <xsl:call-template name="SectionHeader"> <xsl:with-param name="SectionName" >Enumerated Types</xsl:with-param> </xsl:call-template> </xsl:when> </xsl:choose> <xsl:apply-templates select="." mode="doc"/> <xsl:apply-templates select="." mode="struct"/> <xsl:apply-templates select="." mode="range-macro"/> </xsl:template> <!-- --> <!-- This template is used to create the Section Headers --> <!-- --> <!-- Should Be Centered ?? --> <xsl:template name="SectionHeader"> <xsl:param name="SectionName"/> //---------------------------------------------------------------------- ---------------- //---------------------------------------------------------------------- ---------------- // <xsl:value-of select="$SectionName"/> //---------------------------------------------------------------------- ---------------- //---------------------------------------------------------------------- ---------------- </xsl:template> <!-- --> <!-- This template creates the header for an enumerated Type --> <!-- --> <xsl:template match="tblEnumeratedTypes_WC" mode="doc"> //---------------------------------------------------------------------- ---------------- // Name : <xsl:apply-templates select="EnumeratedType"/> // Description : <xsl:apply-templates select="Description"/> //---------------------------------------------------------------------- ---------------- </xsl:template> <!-- --> <!-- This template creates the structure for an enumerated Type --> <!-- --> <xsl:template match="tblEnumeratedTypes_WC" mode="struct"> enum { <xsl:apply-templates> <xsl:sort select="EnumValue"/> </xsl:apply-templates> } ; </xsl:template> <!-- --> <!-- This template creates the line for each of the enumerations within --> <!-- an Enumerated Type --> <!-- --> <xsl:template match="tblEnumValues_WC"> <xsl:call-template name="padSpaces"> <xsl:with-param name="text" > <xsl:call-template name="removeSpaces"> <xsl:with-param name="text" select="EnumValueDescription"/> </xsl:call-template> </xsl:with-param> <xsl:with-param name="size" >20</xsl:with-param> </xsl:call-template> <xsl:text> = </xsl:text> <!-- If we are on the last line, dont add a "," or carriage return --> <xsl:value-of select="EnumValue"/> <xsl:choose> <xsl:when test="last()=position()"> </xsl:when> <xsl:otherwise> <xsl:text>, 
 </xsl:text> </xsl:otherwise> </xsl:choose> </xsl:template> <!-- --> <!-- This template creates call to the RANGE_TYPE Macro for an enumerated Type --> <!-- --> <xsl:template match="tblEnumeratedTypes_WC" mode="range-macro"> <xsl:variable name="Start"> <xsl:call-template name="removeSpaces"> <xsl:with-param name="text" select="(.//EnumValueDescription)[1]"/> </xsl:call-template> </xsl:variable> <xsl:variable name="End" > <xsl:call-template name="removeSpaces"> <xsl:with-param name="text" select="(.//EnumValueDescription)[last()]"/> </xsl:call-template> </xsl:variable> <xsl:variable name="ET" select="EnumeratedType"/> RANGE_TYPE ( UINT8, <xsl:value-of select="$ET"/>, <xsl:value-of select="$Start"/>, <xsl:value-of select="$End"/> ) ; </xsl:template> <!-- --> <!-- --> <!-- --> <xsl:template name="removeSpaces"> <xsl:param name="text"/> <xsl:value-of select="translate($text, ' ', '' )"/> </xsl:template> <!-- --> <!-- --> <!-- --> <xsl:template name="padSpaces"> <xsl:param name="text"/> <xsl:param name="size"/> <xsl:variable name="spaces" select="' '" /> <xsl:value-of select="$text"/> <xsl:choose> <xsl:when test="string-length($text) < $size"> <xsl:value-of select="substring($spaces, 1, $size - string-length($text) )"/> </xsl:when> </xsl:choose> </xsl:template> </xsl:stylesheet> ------------------------------------------- This space Intentionally Left Blank
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] Saxon for windows?, Pieter Reint Siegers | Thread | Re: [xsl] Sort Question, omprakash . v |
Re: [xsl] Saxon for windows?, Karl Stubsjoen | Date | Re: [xsl] Saxon for windows?, Barry Lay |
Month |