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
Conferences Close Tree View
+ Stylus Studio Feature Requests (1192)
+ Stylus Studio Technical Forum (14621)
+ Website Feedback (249)
- XSLT Help and Discussion (7625)
-> + Use of before and after string (3) Sticky Topic
-> - How do I substitute element ty... (1)
-> + How does one add working days ... (4)
-> - Help, I have existing XLT and... (1)
-> + Need help on XSLT issue - (2)
-> + EDI to XML Conversion (7)
-> - XML To JSON Conversion using X... (1)
-> + Formatting Paragraphs to same ... (2)
-> - Grouping of records (1)
-> + Problems with xsd 1.1 (4)
-> + XML to HL7 mapping (3)
-> + XSLT 3 and Iterate (2)
-> + XSL-FO to PDF preview (3)
-> + java.lang.RuntimeException: Er... (2)
-> + Create Acroforms with Stylus X... (2)
-> + How to change XSLT parameter s... (3)
-> + how to change format of the da... (2)
-> + Search "Next 8 Results " doesn... (2)
-> - Support for Git (1)
-> + newbee (8)
-- [1-20] [21-40] [41-60] Next
+ XQuery Help and Discussion (2017)
+ Stylus Studio FAQs (159)
+ Stylus Studio Code Samples & Utilities (364)
+ Stylus Studio Announcements (113)
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
(Deleted User) Subject: Updated: Transform values into elements and then assign values to new elements
Author: (Deleted User)
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.

   
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.