Subject: RE: Saxon8: XML to XML transformation
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Mon, 28 Aug 2006 12:00:47 +0100
|
XMLSpy is probably taking its input from the Microsoft MSXML3 parser, which
notoriously strips whitespace text nodes from the input without you asking
it to. When you do
<xsl:apply-templates select="../superclass/class/child::node()"/>
you are selecting three nodes: two whitespace text nodes, and an element,
and you are processing all of these. The default rule for a text node is to
copy it to the output.
To make your stylesheet work with a standards-compliant XML parser, either
change the above to:
<xsl:apply-templates select="../superclass/class/child::*"/>
so you only process child element nodes, or (preferably) write
<xsl:strip-space elements="*"/>
at the top level of the stylesheet, to indicate that all whitespace text
nodes should be removed before further processing.
Michael Kay
http://www.saxonica.com/
> -----Original Message-----
> From: Marco Pehla [mailto:marco.pehla@xxxxxxxxxxxxxx]
> Sent: 28 August 2006 11:37
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Saxon8: XML to XML transformation
>
> Hello everybody,
>
> I've got a little problem and don't know how to solve it. I
> use Saxon8 inside a JavaBean and want to transform some data
> from an XML file to another XML file. If I use XMLSpy and
> apply the XSLT transformation to the XML file I get the
> desired output, but not with Saxon8.
>
> What am I supposed to do to get the same output like with
> XMLSpy? Why does Saxon behave like that?
>
>
> Thank you in advance,
> with kind regards,
> Marco
>
>
> XML input:
> ---------------
>
> <?xml version="1.0" encoding="UTF-8"?>
> <molecule>
> <object>
> <variable name="marco"/>
> </object>
> <superclass isaType=":">
> <class>
> <constant name="employee"/>
> </class>
> </superclass>
> </molecule>
>
>
> XMLSpy output:
> -----------------------
> <?xml version="1.0" encoding="UTF-8"?>
> <ObjectClassificationAtom class="employee">
> <ObjectVariable name="marco" class="employee"/>
> </ObjectClassificationAtom>
>
>
> Saxon8 output:
> ----------------------
>
> <?xml version="1.0" encoding="UTF-8"?>
> <ObjectClassificationAtom class="
> employee
> ">
> <ObjectVariable name="
> marco
> " class="
> employee
> "/>
>
> </ObjectClassificationAtom>
>
>
> my simple XSLT transformation:
> ----------------------------------------------
> <xsl:stylesheet version="2.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xmlns:fn="http://www.w3.org/2006/xpath-functions"
> xmlns:saxon="http://icl.com/saxon">
> <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
>
> <xsl:template match="/" >
> <xsl:apply-templates/>
> </xsl:template>
>
> <xsl:template match="molecule">
> <xsl:if test="superclass/@isaType = ':'">
> <xsl:element name="ObjectClassificationAtom">
> <xsl:attribute name="class">
> <xsl:apply-templates
> select="superclass/class/child::node()"/>
> </xsl:attribute>
> <xsl:apply-templates/>
> </xsl:element>
> </xsl:if>
> </xsl:template>
>
> <xsl:template match="object">
> <xsl:element name="ObjectVariable">
> <xsl:attribute
> name="name"><xsl:apply-templates/></xsl:attribute>
> <xsl:if test="../superclass">
> <xsl:attribute name="class">
> <xsl:apply-templates
> select="../superclass/class/child::node()"/>
> </xsl:attribute>
> </xsl:if>
> </xsl:element>
> </xsl:template>
>
> <xsl:template match="constant | variable | class">
> <xsl:value-of select="@name"/>
> </xsl:template>
> <!-- ignore all the rest -->
> <xsl:template match="*"/>
> </xsl:stylesheet>
>
> --
> http://www.informatik.tu-cottbus.de/~mpehla/
|