I'll Give that a try thanks a lot for your help I'll let you know how it
goes.

On Thu, Jul 12, 2012 at 7:07 PM, Piotr Sipika <[email protected]>wrote:

> On 07/12/2012 09:53 AM, stuart shepherd wrote:
> > Searching the web I've seen some examples in XSLT on how to
> > do something like this, but I have never used XSLT. Does anyone know if
> > there is a way to do this in XML.
>
> XSLT is your best bet.
>
> Here's a sample stylesheet which will:
>  - change the name of all elements named 'old' to 'new'
>  - change the name of all elements with an attribute named 'old' to 'new'
>
> ---- BEGIN stylesheet ----
>
> <?xml version="1.0" standalone="yes"?>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
>   <xsl:output method="xml"/>
>
>   <!-- Template matches every node and attribute-->
>   <xsl:template match="node()|@*">
>
>     <xsl:choose>
>       <!-- if name of element is 'old' or element contains an attribute
>            named 'old', replace it with 'new' -->
>       <xsl:when test="@old or name(.)='old'">
>         <xsl:variable name="old_node" select="node()"/>
>         <xsl:variable name="old_value" select="./text()"/>
>         <xsl:variable name="attributes" select="@*"/>
>         <xsl:variable name="children" select="./*"/>
>
>         <!-- create a 'new' element with attributes and children from
>              the 'old' node, with its old value -->
>         <xsl:element name="new">
>           <xsl:copy-of select="$attributes|$children"/>
>           <xsl:value-of select="$old_value"/>
>         </xsl:element>
>       </xsl:when>
>
>       <!-- else, just copy the node/attributes -->
>       <xsl:otherwise>
>         <xsl:copy>
>           <xsl:apply-templates select="node()|@*"/>
>         </xsl:copy>
>       </xsl:otherwise>
>     </xsl:choose>
>   </xsl:template>
>
> </xsl:stylesheet>
>
> ---- END stylesheet ----
>
> Sample XML:
> <?xml version="1.0" standalone="yes"?>
> <swap>
>   <old attr="attr1">This used to be inside the old node
>     <old_child1>This is old_child1</old_child1>
>   </old>
>   <foo attr="attr2">This is just a middle element...</foo>
>   <foo old="old attribute"/>
> </swap>
>
> Output of stylesheet processing using xsltproc (libxml 20708, libxslt
> 10126 and libexslt 815):
>
> $ xsltproc swap.xsl swap.xml
> <?xml version="1.0"?>
> <swap>
>   <new attr="attr1"><old_child1>This is old_child1</old_child1>This used
> to be inside the old node
>   </new>
>   <foo attr="attr2">This is just a middle element...</foo>
>   <new old="old attribute"/>
> </swap>
>
>
> You can modify the attribute match criteria (@old) to actually evaluate
> its contents ([@old='old_parent']), etc...
>
> Hope this helps.
>
> Piotr
>
_______________________________________________
xml mailing list, project page  http://xmlsoft.org/
[email protected]
https://mail.gnome.org/mailman/listinfo/xml

Reply via email to