XML Editor
Sign up for a WebBoard account Sign Up Keyword Search Search More Options... Options
Chat Rooms Chat Help Help News News Log in to WebBoard Log in Not Logged in
Show tree view Topic
Topic Page 1 2 3 4 5 6 7 8 9 Go to previous topicPrev TopicGo to next topicNext Topic
Postnext
Everett TSubject: XML-to-XML Transformation
Author: Everett T
Date: 21 Dec 2005 10:44 AM
I am a newbie to XSLT and I'm trying to do something that is somewhat non-standard.

My original XML is formatted in the following manner:
<?xml version= '1.0' ?>
<Bills>
<Bill No="10030" Name="John Doe">
.
. some other XML
.
</Bill>
<Bill No="10009" Name="Jane Jones">
.
. some other XML
.
</Bill>
<Bill No="10100" Name="Bob Smith">
.
. some other XML
.
</Bill>
<Bill No="10030" Name="John Doe">
.
. some other XML
.
</Bill>
</Bills>


I would like to transform it into XML that looks like the following:
<?xml version= '1.0' ?>
<Bills>
<Bill No="10009" Name="Jane Jones" NewBill="1">
.
. some other XML
.
</Bill>
<Bill No="10030" Name="John Doe" NewBill="1">
.
. some other XML
.
</Bill>
<Bill No="10030" Name="John Doe" NewBill="0">
.
. some other XML
.
</Bill>
<Bill No="10100" Name="Bob Smith" NewBill="1">
.
. some other XML
.
</Bill>
</Bills>


Basically, I'm trying to, first, sort all of the Bill tags by the @No attribute. After sorting, I want to go through and add a @NewBill attribute that distinguished whether or not the @No attribute has changed. In the example output above I use a "1" when it is a new bill and a "0" if the @No attribute is the same as the previous bill.

Any help would be greatly appreciated...

Postnext
Minollo I.Subject: XML-to-XML Transformation
Author: Minollo I.
Date: 21 Dec 2005 01:26 PM
There is no automatic mapping for this.

Hand coding it, you can write something like:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<xsl:variable name="orderedBills">
<Bills>
<xsl:for-each select="Bills/Bill">
<xsl:sort select="@No"/>
<xsl:copy-of select="."/>
</xsl:for-each>
</Bills>
</xsl:variable>
<Bills>
<xsl:for-each select="$orderedBills/Bills/Bill">
<Bill>
<xsl:for-each select="@*">
<xsl:copy-of select="."/>
</xsl:for-each>
<xsl:attribute name="NewBill">
<xsl:variable name="previousBill" select="preceding-sibling::Bill[position()=1]"/>
<xsl:choose>
<xsl:when test="not($previousBill) or $previousBill/@No != @No">1</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:apply-templates/>
</Bill>
</xsl:for-each>
</Bills>
</xsl:template>
</xsl:stylesheet>

Postnext
Everett TSubject: XML-to-XML Transformation
Author: Everett T
Date: 22 Dec 2005 10:59 AM
This seems to me like it would work just fine but I keep receiving the following error message during the transformation process.

Error during XSLT transformation: An XPath expression was expected to return a NodeSet.

I assume that it is referring to line where the for-each loop is selecting the $orderedBills variable.

Any idea how to get around this error message?

Thanks again.

Posttop
Minollo I.Subject: XML-to-XML Transformation
Author: Minollo I.
Date: 22 Dec 2005 11:13 AM
What processor are you using?

If you use MSXML you will have to define the xmlns:msxsl="urn:schemas-microsoft-com:xslt" namespace and then use msxsl:node-set($orderedBills).

If you use Saxon 6.x you will have to define the xmlns:exslt="http://exslt.org/common" namespace and then use exslt:node-set($orderedBills).

In Xalan-J you will have to define the xmlns:xalan="http://xml.apache.org/xalan" namespace and then use xalan:nodest($orderedBills).

Minollo

 
Topic Page 1 2 3 4 5 6 7 8 9 Go to previous topicPrev TopicGo to next topicNext Topic
Download A Free Trial of Stylus Studio 6 XML Professional Edition Today! Powered by Stylus Studio, the world's leading XML IDE for XML, XSLT, XQuery, XML Schema, DTD, XPath, WSDL, XHTML, SQL/XML, and XML Mapping!  
go

Log In Options

Site Map | Privacy Policy | Terms of Use | Trademarks
Stylus Scoop XML Newsletter:
W3C Member
Stylus Studio® and DataDirect XQuery ™are from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2016 All Rights Reserved.