Sorry I pasted the wrong error. I had put some comments in xsl
transformation. The error is coming at the line where an attribute is
created i.e., <xsl:attribute name="{name()}">. This time I used the exact
transformation suggested by Dimitre. The output i got is below, only change
is in line number.
<customerList>
<customer>
file:/C:/working/XML/posting/../elmToAtt.xsl; Line 59; Column -1; id has an
illegal attribute: {1}
<field id="customerId">cust1</field>
file:/C:/working/XML/posting/../elmToAtt.xsl; Line 59; Column -1; id has an
illegal attribute: {1}
<field id="customerName">Customer 1</field>
<fieldGroup id="homeAddress">
<fieldList>
<field id="street">98th Street </field>
<field id="city">Chicago</field>
</fieldList>
</fieldGroup>
<fieldGroup id="companyAddress">
<fieldList>
<field id="street">128th Street</field>
<field id="city">Chicago</field>
</fieldList>
</fieldGroup>
</customer>
</customerList>
-----Original Message-----
From: Sindigi, Ganesh K
Sent: Thursday, October 30, 2003 10:37 AM
To: 'xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com'
Subject: RE: [xsl] Re: Converting specific child elements into attriutes
of parent
Thanks to all.
One thing I noticed is the order of elements in the source.xml is also a
reason for this error :-(
For e.g., if the <id> is coming after <value>, then this error is still
coming.
As the source xml is coming from different interfaces, i do not have any
control on the order of elements :-(. How do i resolve this?
When i ran the command "java org.apache.xalan.xslt.Process -in source.xml
-xsl ..\elmToAtt.xsl"
Dimitre I used transformation provided by you and applied on this
source.xml.
(Notice that the order <id> and <value> elements in the first two <field>s
has been interchanged)
<customerList>
<customer>
<field>
<value>cust1</value>
<id>customerId</id>
</field>
<field>
<value>Customer 1</value>
<id>customerName</id>
</field>
<fieldGroup>
<id>homeAddress</id>
<fieldList>
<field>
<id>street</id>
<value>98th Street </value>
</field>
<field>
<id>city</id>
<value>Chicago</value>
</field>
</fieldList>
</fieldGroup>
<fieldGroup>
<id>companyAddress</id>
<fieldList>
<field>
<id>street</id>
<value>128th Street</value>
</field>
<field>
<id>city</id>
<value>Chicago</value>
</field>
</fieldList>
</fieldGroup>
</customer>
</customerList>
which produced the following result (With two errors)
<customerList>
<customer>
file:/C:/working/XML/posting/../elmToAtt.xsl; Line 66; Column -1; id has an
illegal attribute: {1}
<field id="customerId">cust1</field>
file:/C:/working/XML/posting/../elmToAtt.xsl; Line 66; Column -1; id has an
illegal attribute: {1}
<field id="customerName">Customer 1</field>
<fieldGroup id="homeAddress">
<fieldList>
<field id="street">98th Street </field>
<field id="city">Chicago</field>
</fieldList>
</fieldGroup>
<fieldGroup id="companyAddress">
<fieldList>
<field id="street">128th Street</field>
<field id="city">Chicago</field>
</fieldList>
</fieldGroup>
</customer>
</customerList>
-----Original Message-----
From: Dimitre Novatchev [mailto:dnovatchev(_at_)yahoo(_dot_)com]
Sent: Thursday, October 30, 2003 2:01 AM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Re: Converting specific child elements into attriutes of
parent
I have been trying to convert specific child elements into attributes of
the
parent node. I looked through archive, there was a topic of converting
all
children to attributes of the root. I followed the same thing and tried
to
convert a specific child element, but i am getting following error.
elmToAtt.xsl; Line 18; Column -1; name() has an illegal attribute: {1}
I would like to copy the xml document and convert only specific elements
into attributes.
I am not able to make out why this error is, but to no avail. Hoping that
anybody in the list would help to resolve .
The specific error can be corrected by using AVT like this:
name="{name()}"
Here's a transformation, which converts any element, whose name is in a list
of names, to an identically named attribute of its parent:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my"
exclude-result-prefixes="my"
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<my:elNames>
<name>id</name>
</my:elNames>
<xsl:variable name="elNames"
select="document('')/*/my:elNames/name"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:choose>
<xsl:when test="not(name() = $elNames)">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="*[name() = $elNames]"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="value">
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
When this transformation is applied on your original source.xml:
<customerList>
<customer>
<field>
<id>customerId</id>
<value>cust1</value>
</field>
<field>
<id>customerName</id>
<value>Customer 1</value>
</field>
<fieldGroup>
<id>homeAddress</id>
<fieldList>
<field>
<id>street</id>
<value>98th Street </value>
</field>
<field>
<id>city</id>
<value>Chicago</value>
</field>
</fieldList>
</fieldGroup>
<fieldGroup>
<id>companyAddress</id>
<fieldList>
<field>
<id>street</id>
<value>128th Street</value>
</field>
<field>
<id>city</id>
<value>Chicago</value>
</field>
</fieldList>
</fieldGroup>
</customer>
</customerList>
the wanted result is produced:
<customerList>
<customer>
<field id="customerId">cust1</field>
<field id="customerName">Customer 1</field>
<fieldGroup id="homeAddress">
<fieldList>
<field id="street">98th Street </field>
<field id="city">Chicago</field>
</fieldList>
</fieldGroup>
<fieldGroup id="companyAddress">
<fieldList>
<field id="street">128th Street</field>
<field id="city">Chicago</field>
</fieldList>
</fieldGroup>
</customer>
</customerList>
Hope this helped.
=====
Cheers,
Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list