[xsl] Identity transform (case conversion)

Subject: [xsl] Identity transform (case conversion)
From: "Mukul Gandhi" <gandhi.mukul@xxxxxxxxx>
Date: Fri, 7 Jul 2006 22:26:45 +0530
Hello All,
 I am trying to write a XSLT stylesheet (I am seeking both 1.0 and
2.0 solutions. If extensions are unavoidable, I can use them) which
will take as input any XML document, and produce as output, a XML
document which is an identity of the input (i.e. what is produced by
the identity transform). But the condition is: all the letters (a-z)
anywhere in source XML should change from small case to capitals.

for e.g.

this source XML:

<?xml version="1.0" ?>
<!-- this is a comment -->
<?pqr x="do-something" ?>
<author xmlns:a="xyz" xmlns:b="pqr">
<person age="30"> by <FirstName>Jane</FirstName>
<LastName>Doe</LastName>,
</person>
</author>

should transform to:

<?xml version="1.0" encoding="UTF-8"?>
<!-- THIS IS A COMMENT -->
<?PQR X="DO-SOMETHING" ?>
<AUTHOR xmlns:A="XYZ" xmlns:B="PQR">
  <PERSON AGE="30"> BY <FIRSTNAME>JANE</FIRSTNAME>
     <LASTNAME>DOE</LASTNAME>,
</PERSON>
</AUTHOR>

Here is my attempt:

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

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

  <xsl:variable name="small" select="'abcdefghijklmnopqrstuvwxyz'" />
  <xsl:variable name="caps" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />

  <xsl:template match="*">
    <xsl:element name="{translate(name(), $small, $caps)}">
      <xsl:copy-of select="current()//namespace::*" />
      <xsl:apply-templates select="@*" />
      <xsl:apply-templates />
    </xsl:element>
  </xsl:template>

  <xsl:template match="text()">
    <xsl:value-of select="translate(., $small, $caps)" />
  </xsl:template>

  <xsl:template match="@*">
    <xsl:attribute name="{translate(name(), $small,
$caps)}"><xsl:value-of select="translate(., $small, $caps)"
/></xsl:attribute>
  </xsl:template>

  <xsl:template match="processing-instruction()">
    <xsl:processing-instruction name="{translate(name(), $small,
$caps)}"><xsl:value-of select="translate(., $small, $caps)"
/></xsl:processing-instruction>
  </xsl:template>

  <xsl:template match="comment()">
    <xsl:comment><xsl:value-of select="translate(., $small, $caps)"
/></xsl:comment>
  </xsl:template>

</xsl:stylesheet>

This stylesheet produces output:

<?xml version="1.0" encoding="UTF-8"?>
<!-- THIS IS A COMMENT -->
<?PQR X="DO-SOMETHING" ?>
<AUTHOR xmlns:a="xyz" xmlns:b="pqr">
  <PERSON AGE="30"> BY <FIRSTNAME>JANE</FIRSTNAME>
     <LASTNAME>DOE</LASTNAME>,
</PERSON>
</AUTHOR>

Everything else is fine, except the namespace handling. Their case is
not getting converted. What needs to be done for this?

Another questions is:
The above output gets produced identically by Saxon 8.7.3 and MSXML
4.0. But with Xalan-J 2.7.0, namespaces are not getting generated in
the output.

Xalan produces output:

<?xml version="1.0" encoding="UTF-8"?>
<!-- THIS IS A COMMENT -->
<?PQR X="DO-SOMETHING" ?>

<AUTHOR>
 <PERSON AGE="30"> BY <FIRSTNAME>JANE</FIRSTNAME>
   <LASTNAME>DOE</LASTNAME>,
 </PERSON>
</AUTHOR>

Is this a Xalan bug?

Regards,
Mukul

Current Thread