XSL xmlns usage problems during transform

J

jorgen.wahlund

Hi

I have problems with transforming a xml document with Xalan and
javax.xml.Transformer.

Following xsl is used:
<xsl:stylesheet version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
xmlns:xalan="http://xml.apache.org/xslt"
xmlns:java="java"
xmlns:convert="com.foo.Class">

<xsl:eek:utput method="xml"
encoding="UTF-8"
indent="yes"
xalan:indent-amount="2"/>
<and so on with specific transformation>
</xsl:stylesheet>

The xml parsed have the followin format:
<?xml version="1.0" encoding="utf-16"?>
<MessageHeader xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.foo2.com/XMLSchema/Envelope">
<Message xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
messageId="EMI20051026093900046"
xmlns="http://www.foo2.com/Schema.xsd">

<and so on with specific tags>


The problem I have is that the transformation, that earlier worked
fine, has stopped to work. The only differense is the last part of the
given xml. It has changed from:
xmlns=""
to
xmlns="http://www.foo2.com/Schema.xsd"

And the transformation stopps early without transforming the rest of
the document.


Questions:
What does the xmlns field do actually?
Can one override the xmlns field?
Any other solutions?

Remember that the xml given is from a another part and we cant control
the xml sent to us.

Thank you for your help
Jörgen
 
M

Martin Honnen

Following xsl is used:
<xsl:stylesheet version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
xmlns:xalan="http://xml.apache.org/xslt"
xmlns:java="java"
xmlns:convert="com.foo.Class">
The xml parsed have the followin format:
<?xml version="1.0" encoding="utf-16"?>
<MessageHeader xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.foo2.com/XMLSchema/Envelope">

The problem is that various elements are in a default namespace defined
with xmlns="namespaceURI" so those elements have a name without a prefix
(e.g. MessageHeader) but are in a certain namespace.
To match that with XPath 1.0 you need to bind a prefix to the default
namespace and use that prefix in XPath expressions and XSLT match
matterns. No change is needed on the XML input but inside of the
stylesheet you need to add e.g.
xmlns:pf1="http://www.foo2.com/XMLSchema/Envelope"
xmlns:pf2="http://www.foo2.com/Schema.xsd"
on the xsl:stylesheet element, then your XPath expressions can look alike
/pf1:MessageHeader/pf2:Message
to select elements in the namespaces bound to the prefixes used.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,774
Messages
2,569,599
Members
45,175
Latest member
Vinay Kumar_ Nevatia
Top