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
Joshua HuntSubject: Transform values into elements and then assign values to new elements
Author: Joshua Hunt
Date: 08 Jan 2008 07:24 PM
Hi there,

I need to transform the following XML doc:

<data>
<headers>
<column>title</column>
<column>author</column>
</headers>
<values>
<column>a book</column>
<column>an author</column>
</values>
</data>

Into the format below:

<data>
<title>a book</title>
<author>an author</author>
</data>

Basically, I need each value in <headers> to become an element and then have a value from <values> assigned to it. There will always be as many <headers> values as there are <values> values. Association would be each <headers> column needs to be tied up with each <values> column in turn.

Hopefully this makes sense.

I have tried various solutions, but none of them have come close so far.

Thank you for any help you can provide.

Josh

Postnext
Joshua HuntSubject: Updated: Transform values into elements and then assign values to new elements
Author: Joshua Hunt
Date: 09 Jan 2008 12:53 AM
Originally Posted: 08 Jan 2008 11:30 PM
I am closer to a solution, but need help on the home stretch. I am new to this stuff, so go easy on me. It seems that the following can be done with a two phase approach using temporary trees, but I am constrained to XSLT 1.0 and this is only available in 2.0. Any workarounds would be greatly appreciated. Prefereably one that doesn't require writing an XML doc to file.

I have the following xml doc:

<data>
<headers>
<column>title</column>
<column>author</column>
</headers>
<values>
<column>a book</column>
<column>an author</column>
</values>
</data>

I have added id attributes using the following xslt:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" version="1.0"
encoding="UTF-8" indent="yes"/>
<xsl:variable name="headers" select="*"/>
<xsl:template match="/">
<data>
<headers>
<xsl:for-each select="/data/headers/column">
<xsl:element name="column">
<xsl:attribute name="id"><xsl:value-of select="position()"/></xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</headers>
<values>
<xsl:for-each select="/data/values/column">
<xsl:element name="column">
<xsl:attribute name="id"><xsl:value-of select="position()"/></xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</values>
</data>
</xsl:template>
</xsl:stylesheet>

This results in the following:

<?xml version="1.0" encoding="UTF-8"?>
<data>
<headers>
<column id="1">title</column>
<column id="2">author</column>
</headers>
<values>
<column id="1">a book</column>
<column id="2">an author</column>
</values>
</data>

From there I use the following XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0"
encoding="UTF-8" indent="yes"/>

<xsl:variable name="headers" select="*"/>

<xsl:template match="@* | node()">
<xsl:apply-templates select="@* | node()"/>
</xsl:template>

<xsl:template match="/data/values/column">
<xsl:variable name="index" select="@id"/>
<xsl:variable name="newelement" select="$headers/headers/column[@id =$index]"/>
<xsl:element name="{$newelement}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>

And this gives me exactly what I need:

<?xml version="1.0" encoding="UTF-8"?>
<title>a book</title>
<author>an author</author>

I really need to do this with a single XSLT. Can someone help me integrate the 2 stylesheets into a single one?

Thanks,

Josh

Postnext
Alberto MassariSubject: Updated: Transform values into elements and then assign values to new elements
Author: Alberto Massari
Date: 09 Jan 2008 05:19 AM
Hi Joshua,
if your XML only contains one set of "headers" and "values", this should work:

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

<xsl:template match="/">
<data>
<xsl:for-each select="data/headers/column">
<xsl:variable name="pos" select="position()"/>
<xsl:element name="{.}">
<xsl:value-of select="/data/values/column[position()=$pos]"/>
</xsl:element>
</xsl:for-each>
</data>
</xsl:template>

</xsl:stylesheet>

Alberto

Posttop
Joshua HuntSubject: Thank you
Author: Joshua Hunt
Date: 09 Jan 2008 05:33 PM
Thankyou Alberto. That works perfectly.

 
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.