Subject: Re: [xsl] Some attribute not displayed in output From: lee qm <akimilee@xxxxxxxxx> Date: Fri, 28 Aug 2009 15:28:01 +0800 |
Thanks ac. The </header> is a copy and paste error; it should be </Info> instead. I had another problem which need help. src.xml ----------- <info> <user id="123" /> <Product Category="A" /> <Product Category="B" /> <!-- a lot of other element .......--> </info> Expected output ------------------------ <o t="info"> <a n="user"> <o t="user"> <a n="id"> <v s="123"> </a> </o> </a> <a n="Product"> <o t="Prodcut"> <a n="Category"> <v s="A"> </a> </o> <o t="Product"> <a n="Category"> <v s="B"> </a> </o> </a> </o> Stylesheet ---------------- So basically for each element that found in src file, we should write it in following format <a n="element name"> <o t="element name"> </o> </a> But when two similar element found, such as "Product", we should write it as below: <a n="element name"> <o t="element name"> </o> <o t="element name"> </o> </a> My stylesheet below only works for single element: <xsl:template match="*"> <a n="{name(.)}"> <o t="{name(.)}"> <xsl:for-each select="@*"> <a n="{name(.)}"> <xsl:element name="v"> <xsl:attribute name="s"> <xsl:value-of select="normalize-space(.)"/> </xsl:attribute> </xsl:element> </a> </xsl:for-each> <xsl:apply-templates/> </o> </a> </xsl:template> How do I modify the stylesheet so that it can handle multiple element with the same name to match the expected output? On Thu, Aug 27, 2009 at 11:45 AM, ac<ac@xxxxxxxxxxxxx> wrote: > Hi, > > You could possibly simply add a template like > > <xsl:template match="o[@t='Info']"> > <xsl:element name="{@t}"> > <xsl:apply-templates select="a[(@n!='Info') and (@n!='Sender')]"/> > <xsl:apply-templates select="a[(@n='Info') or (@n='Sender')]"/> > </xsl:element> > </xsl:template> > > which would ensure that attributes are processed first. > > But I can not see where the </Header> in your output comes from. > > Cheers, > ac > > > >> I had following src xml file which needs to convert to the output.xml >> given below. >> I found some of the attributes ("MissingAttribute" in example given >> below) is not written to the output.xml with the stylesheet given. >> I check the spec and found that adding attribute after child node is >> added is illegal. >> >> Can someone help me on how to modify the stylesheet to get the >> expected output (where "MissingAttribute" appeared as a attribute of >> Header element)? >> >> src.xml (simplied version, the actual src files had many 'a' element) >> ----------- >> <?xml version="1.0" encoding="UTF-8"?> >> <data> >> <o t="request"> >> <a n="Info"> >> <o t="Info"> >> <a n="TimeStamp"> >> <v s="2009-08-81 12:59:59"/> >> </a> >> <a n="Sender"> >> <o t="Sender"> >> <a n="Login"> >> <v s="username"/> >> </a> >> </o> >> </a> >> <a n="MissingAttribute"> >> <v s="xxx"/> >> </a> >> </o> >> </a> >> </o> >> </data> >> >> output.xml >> ---------------- >> <?xml version="1.0" encoding="utf-8"?> >> <request> >> <Info TimeStamp="2009-08-81 12:59:59" MissingAttribute="xxx"> >> <Sender Login="username"/> >> </Header> >> </request> >> >> Stylesheet >> ---------------- >> <xsl:template match="o"> >> <xsl:element name="{@t}"> >> <xsl:apply-templates select="a"/> >> </xsl:element> >> </xsl:template> >> >> <xsl:template match="a"> >> <xsl:if test="(@n!='Info') and (@n!='Sender') "> >> <xsl:attribute name="{@n}"> >> <xsl:for-each select="v"> >> <xsl:value-of select="@s"/> >> </xsl:for-each> >> </xsl:attribute> >> </xsl:if> >> <xsl:if test="(@n='Info') or (@n='Sender') "> >> <xsl:apply-templates select="o"/> >> </xsl:if> >> </xsl:template>
Current Thread |
---|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Some attribute not displa, ac | Thread | Re: [xsl] Some attribute not displa, ac |
Re: [xsl] IE does not comprehend de, denit thomas | Date | RE: [xsl] DTD and Collection, Michael Kay |
Month |