aspose file tools*
The moose likes XML and Related Technologies and the fly likes Remove sibling elements according to the value of the attribute of another element Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of EJB 3 in Action this week in the EJB and other Java EE Technologies forum!
JavaRanch » Java Forums » Engineering » XML and Related Technologies
Bookmark "Remove sibling elements according to the value of the attribute of another element" Watch "Remove sibling elements according to the value of the attribute of another element" New topic
Author

Remove sibling elements according to the value of the attribute of another element

Patrizio Trinchini
Greenhorn

Joined: Aug 23, 2006
Posts: 1
Hi All,

given the following source XML document:

<?xml version="1.0" encoding="UTF-8"?>
<sample xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNameSpaceSchemaLocation="sample.xsd">
<parent-element>
<child-element name="AAA" value="XXX"/>
<sibling-element-1 id="001">Sibling 1 of child-element AAA</sibling-element-1>
<sibling-element-2 id="002">Sibling 2 of child-element AAA</sibling-element-2>
</parent-element>
<parent-element>
<child-element name="BBB" value="XXX"/>
<sibling-element-1 id="003">Sibling 1 of child-element BBB</sibling-element-1>
<sibling-element-2 id="004">Sibling 2 of child-element BBB</sibling-element-2>
</parent-element>
<parent-element>
<child-element name="CCC" value="XXX"/>
<sibling-element-1 id="005">Sibling 1 of child-element CCC</sibling-element-1>
<sibling-element-2 id="006">Sibling 2 of child-element CCC</sibling-element-2>
</parent-element>
</sample>

I would otain the following result:

<?xml version="1.0" encoding="UTF-16"?>
<sample xsi:noNameSpaceSchemaLocation="sample.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<parent-element>
<child-element name="AAA" value="aNewValue1"></child-element>
<sibling-element-1 id="001">Sibling 1</sibling-element-1>
<sibling-element-2 id="002">Sibling 2</sibling-element-2>
</parent-element>
<parent-element>
<child-element name="BBB" value="aNewValue2"></child-element>
<sibling-element-1 id="010">Sibling 1</sibling-element-1>
<sibling-element-2 id="020">Sibling 2</sibling-element-2>
</parent-element>
<parent-element>
<child-element name="CCC" value="aNewValue3"></child-element>
</parent-element>
</sample>

I'm able to get it using the following XSLT transformer:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xslutput indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="child-element[@name = 'AAA']/@value">
<xsl:attribute name="{name()}">aNewValue1</xsl:attribute>
</xsl:template>
<xsl:template match="child-element[@name = 'BBB']/@value">
<xsl:attribute name="{name()}">aNewValue2</xsl:attribute>
</xsl:template>
<xsl:template match="child-element[@name = 'CCC']/@value">
<xsl:attribute name="{name()}">aNewValue3</xsl:attribute>
</xsl:template>
<xsl:template match="parent-element/sibling-element-1">
<xsl:if test="preceding-sibling::child-element[@name != 'CCC']">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:if>
</xsl:template>
<xsl:template match="parent-element/sibling-element-2">
<xsl:if test="preceding-sibling::child-element[@name != 'CCC']">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:if>
</xsl:template>
</xsl:stylesheet>

Do you think that this is a valid approach or maybe there is a better
one, especially for the removal of elements according to the value of
the name attribute of the sibling child-element ?

Thanks a lot for any suggestion.

Patrizio
Paul Clapham
Bartender

Joined: Oct 14, 2005
Posts: 18115
    
    8

If you had asked how to remove elements from an XML document, I would have suggested using an XSLT identity transformation plus a template that failed to copy the elements you wanted to remove. And that's what you have there. So yes, I approve.

Besides, it works, right?
 
I agree. Here's the link: http://aspose.com/file-tools
 
subject: Remove sibling elements according to the value of the attribute of another element
 
Similar Threads
removing duplicate elements
Difference between count() and last()
following::* doubt
Preceding siblings
XSLT merging help