[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

RE: Re: Converting specific child elements into attriu

Subject: RE: Re: Converting specific child elements into attriutes of parent
From: "Sindigi, Ganesh K" <SindiGK@xxxxxxxxxxxxxxxxxxxxxx>
Date: Thu, 30 Oct 2003 10:48:32 -0700
has an illegal attribute
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@xxxxxxxxxxxxxxxxxxxxxx'
Subject: RE:  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@xxxxxxxxx]
Sent: Thursday, October 30, 2003 2:01 AM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject:  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


Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.