[xsl] Error during choose statement

Subject: [xsl] Error during choose statement
From: "nick public" <nickpubl@xxxxxxxxx>
Date: Sun, 4 Jan 2009 17:47:07 +0100
Hi people.
I have the following need:
given a complicated XML source, I have to change in output the text
element for same nodes maintaining the source structure.
An example can be this in which I want to change the <elem2> text
values, present in different levels.

===================== SOURCE =====================
<?xml version="1.0" encoding="utf-8"?>
<root>
  <level1 name="xyz">
    <elem1>element</elem1>
    <level2a>
      <elemx>wwww</elemx>
      <elem2>SUB ELEMENT</elem2>
      <level3>
        <elem1>sub element1</elem1>
        <elem2>SUB ELEMENT</elem2>
        <elem3>sub element1</elem3>
      </level3>
    </level2a>
    <level2b>
      <elem2>SUB ELEMENT</elem2>
    </level2b>
  </level1>
</root>
=========================================================

===================== DESIRED TARGET =====================
<?xml version="1.0" encoding="utf-8"?>
<root>
  <level1 name="xyz">
    <elem1>element</elem1>
    <level2a>
      <elemx>wwww</elemx>
      <elem2>NEW ELEM</elem2>
      <level3>
        <elem1>sub element1</elem1>
        <elem2>NEW ELEM</elem2>
        <elem3>sub element1</elem3>
      </level3>
    </level2a>
    <level2b>
      <elem2>NEW ELEM</elem2>
    </level2b>
  </level1>
</root>
=========================================================

I'm trying to use the following XSL script

===================== XSLT =====================
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl">

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

  <xsl:template match="/">
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="@*|node()">
    <xsl:choose>
      <xsl:when test="elem2">
        <elem2>NEW ELEM</elem2>
      </xsl:when>
      <xsl:otherwise>
        <xsl:copy>
          <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
      </xsl:otherwise>
    </xsl:choose>   </xsl:template>
</xsl:stylesheet>
=========================================================

With this, I can just obtain the following output

===================== DAMNED TARGET =====================
<?xml version="1.0" encoding="utf-8"?>
<root>
  <level1 name="xyz">
    <elem1>element</elem1>
    <elem2>NEW ELEM</elem2>
    <elem2>NEW ELEM</elem2>
  </level1>
</root>
=========================================================

in which are missing all sub-nodes nested in <level1>.

The strange thing (for me) is that, if I substitude the <choose> block
with the <otherwise> code, I obtain a result tree identical to source
tree.

===================== SIMPLIFIED XSLT =======================
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl">

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

  <xsl:template match="/">
    <xsl:apply-templates/>
  </xsl:template>

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

</xsl:stylesheet>
=========================================================

Obviously, in this way I cannot chack the node name for set the
appropriate value.

Could you help me?

Thanks a lot and ciao.
Nicola

Current Thread