XML.orgXML.org
FOCUS AREAS |XML-DEV |XML.org DAILY NEWSLINK |REGISTRY |RESOURCES |ABOUT
OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index]
Re: [xml-dev] Subtree transformation

You need to use the "identity template" pattern.

Please try this stylesheet:

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

  <xsl:output method="xml" indent="yes" />

  <!-- identity template; copies everything -->
  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
  </xsl:template>

  <!-- template for last "c" node -->
  <xsl:template match="c[not(following-sibling::c)]">
    <xsl:copy>
      <xsl:apply-templates select="@*" />
      <xsl:apply-templates />
    </xsl:copy>
    <c id="2"/>
    <c id="3"/>
  </xsl:template>

</xsl:stylesheet>

This when applied to the XML:

<a>
  <b>
    <bb>
      <bbb/>
    </bb>
    <c id="1"/>
  </b>
  <d>
    <e/>
    ...
  </d>
</a>

Produces output:

<?xml version="1.0" encoding="UTF-8"?>
<a>
  <b>
    <bb>
      <bbb/>
    </bb>
    <c id="1"/>
    <c id="2"/>
    <c id="3"/>
  </b>
  <d>
    <e/>
    ...
  </d>
</a>

Hope this helps.

On 3/15/07, Garvin Riensche <g.riensche@gmx.net> wrote:
> Hello,
>
> I am wondering if it is possible to change a subtree of an XML tree
> whose structure is not always the same. For example, the input XML can
> look like
>
> <a>
>   <b>
>     <c id="1"/>
>   </b>
> </a>
>
> I want to add some more "<c>" tags as children of the "<b>" tag to get
> something like this:
>
> <a>
>   <b>
>     <c id="1"/>
>     <c id="2"/>
>     ...
>   </b>
> </a>
>
> If the input would always look like this I would write a stylesheet that
> looks like the following:
>
> <xsl:stylesheet match="/">
> <a>
>   <b>
>     <xsl:copy-of="/a/b/c"/>
>     <c id="2"/>
>     <c id="3"/>
>   </b>
> </a>
>
> But how can I add further siblings to "<c>" if the preceding nodes
> differ and if there are more tags below the closing "</b>" like in this
> example:
>
> <a>
>   <b>
>     <bb>
>       <bbb/>
>     </bb>
>     <c id="1"/>
>   </b>
>   <d>
>      <e/>
>      ...
>   </d>
> </a>
>
>
> I need to copy everything and add some additional "<c>" tags. I dont't
> know how to do that becase with xsl:copy-of I can copy the whole tree
> but it can not be changed and if I iterate trough the tree with xsl:copy
> every tag is immideately closed. It would be nice if someone could help.
>
> Regards,
> Garvin


-- 
Regards,
Mukul Gandhi


[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index]


News | XML in Industry | Calendar | XML Registry
Marketplace | Resources | MyXML.org | Sponsors | Privacy Statement

Copyright 1993-2007 XML.org. This site is hosted by OASIS