Re: [xsl] Some attribute not displayed in output

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