Click to See Complete Forum and Search --> : XML Manipulating


buddy99
01-12-2010, 11:45 PM
Hi everybody

Can anybody there help me in solving the following issue.

Consider the XML

<row>
<column>Business Strategy</column>
<column>bus1</column>
</row>
<row>
<column>Company Description</column>
<column>tar1</column>
</row>
<row>
<column>Business Strategy</column>
<column>bus2</column>
</row>
<row>
<column>Company Description</column>
<column>tar2</column>
</row>
<row>
<column>Business Strategy</column>
<column>bus3</column>
</row>
<row>
<column>Company Description</column>
<column>tar3</column>
</row>

Can this xml be parsed and manipulated in ruby as

<row>
<column>Business Strategy</column>
<column>bus1</column>
<column>bus2</column>
<column>bus3</column>
</row>
<row>
<column>Company Description</column>
<column>tar1</column>
<column>tar2</column>
<column>tar3</column>
</row>

Any help would be greatly appreciated.



Thanks in advance


Anandh

xml-looser
01-14-2010, 06:28 AM
you can use xslt

xml for testing

i use root tag to make xml valid

<?xml version="1.0"?>
<root>
<row>
<column>Business Strategy</column>
<column>bus1</column>
</row>
<row>
<column>Company Description</column>
<column>tar1</column>
</row>
<row>
<column>Business Strategy</column>
<column>bus2</column>
</row>
<row>
<column>Company Description</column>
<column>tar2</column>
</row>
<row>
<column>Business Strategy</column>
<column>bus3</column>
</row>
<row>
<column>Company Description</column>
<column>tar3</column>
</row>
</root>


xsl


<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml"/>
<xsl:key match="column" name="only" use="."/>
<xsl:template match="/">
<xsl:apply-templates select="/root"/>
</xsl:template>
<xsl:template match="root">

<xsl:for-each select="row/column[1][generate-id() = generate-id(key('only', .)[1])]">
<row>
<column>
<xsl:value-of select="."/>
</column>
<xsl:variable name="test" select="."/>
<xsl:apply-templates select="//row[column[1]=$test]"/>
</row>
</xsl:for-each>
</xsl:template>
<xsl:template match="row">
<column>
<xsl:value-of select="column[2]"/>
</column>
</xsl:template>
</xsl:stylesheet>



this result is not a valid xml file

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml"/>
<xsl:key match="column" name="only" use="."/>
<xsl:template match="/">
<xsl:apply-templates select="/root"/>
</xsl:template>
<xsl:template match="root">

<xsl:for-each select="row/column[1][generate-id() = generate-id(key('only', .)[1])]">
<row>
<column>
<xsl:value-of select="."/>
</column>
<xsl:variable name="test" select="."/>
<xsl:apply-templates select="//row[column[1]=$test]"/>
</row>
</xsl:for-each>
</xsl:template>
<xsl:template match="row">
<column>
<xsl:value-of select="column[2]"/>
</column>
</xsl:template>
</xsl:stylesheet>


Question use ICQ 567877710