xsl-list
[Top] [All Lists]

RE: Generating XML fragment to DOM node using XSL

2003-12-16 17:02:50
I believe this does what you want, I've included the java source, the xml and 
xsl files... I used xalan-j_2.5.1. I found that passing an Element to the 
DOMResult constructor caused an error during the transform when there wasn't a 
single document node, using a DocumentFragment worked. This seems like a bug in 
xalan...

Hope this helps,
Josh

### test.java

import java.io.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
import javax.xml.transform.dom.*;

import org.w3c.dom.*;
import org.apache.xerces.dom.DocumentImpl;
import org.apache.xml.serializer.*;

public class test {
        static public void main(String[] args) {
                try {
                        // Create xsl source
                        StreamSource xslSource = new StreamSource(new 
File(args[0]));
                        // Create xml source
                        StreamSource xmlSource = new StreamSource(new 
File(args[1]));

                        // Create transformer
                        TransformerFactory tFactory = 
TransformerFactory.newInstance();
                        /// output the xslt
                        Transformer transformer = 
tFactory.newTransformer(xslSource);

                        // Create document
                        // <ui><listbox><model/></listbox></ui>
                        Document doc = new DocumentImpl();
                        Element ui = doc.createElement("ui");
                        Element listbox = doc.createElement("listbox");
                        Element model = doc.createElement("model");
                        doc.appendChild(ui);
                        ui.appendChild(listbox);
                        listbox.appendChild(model);

                        // Fragment to hold transformation
                        DocumentFragment frag = doc.createDocumentFragment();

                        DOMResult dr = new DOMResult(frag);
                        transformer.transform(xmlSource, dr);

                        // append transformed frag into model element
                        model.appendChild(frag);
                        
                        // Dump to System.out
                        Transformer identity = tFactory.newTransformer();
                        identity.setOutputProperty("indent","yes");
                        
identity.setOutputProperty("{http://xml.apache.org/xslt}indent-amount","4";);
                        identity.transform(new DOMSource(doc), new 
StreamResult(System.out));

                } catch ( Exception e ) {
                        e.printStackTrace();
                }
        }
}

### xml.xml

<?xml version="1.0" encoding="UTF-8"?>

<addrList>
        <address>
                <name>One</name>
                <name>Two</name>
                <name>Three</name>
                <name>Four</name>
        </address>
</addrList>

### xsl.xsl

<?xml version="1.0"?>

<xsl:stylesheet 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; 
        version="1.0">
<xsl:output method="xml" indent="no"/>
  <xsl:template match="/">
                <xsl:copy-of select="addrList/address/name"/>
        </xsl:template>
</xsl:stylesheet>

### System.out: 

<ui>
    <listbox>
        <model>
            <name>One</name>
            <name>Two</name>
            <name>Three</name>
            <name>Four</name>
        </model>
    </listbox>
</ui>


-----Original Message-----
From: Steve Dussinger [mailto:sdussing(_at_)adobe(_dot_)com]
Sent: Tuesday, December 16, 2003 1:10 PM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] Generating XML fragment to DOM node using XSL


On 12/16/03 12:49 PM, "cknell(_at_)onebox(_dot_)com" 
<cknell(_at_)onebox(_dot_)com> wrote:

Here are two XML documents and an XSLT stylesheet

sduss_a.xml
-------------
<?xml version="1.0" encoding="UTF-8" ?>
<menu>
<breakfast />
<lunch />
</menu>


sduss_b.xml
-------------
<?xml version="1.0" encoding="UTF-8" ?>
<dinner>
<salad />
<soup />
<main-dish />
<dessert />
</dinner>

sduss.xsl
-------------
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:output method="xml" indent="yes" encoding="UTF-8" />
<xsl:variable name="dinner" select="document('sduss_b.xml')" />

<xsl:template match="/menu">
  <menu>
    <xsl:copy-of select="*" />
    <xsl:copy-of select="$dinner/*" />
  </menu>
</xsl:template>

</xsl:stylesheet>

Now apply suss.xsl to sduss_a.xml and you will get:

<?xml version="1.0" encoding="UTF-8"?>
<menu>
<breakfast />
<lunch />
<dinner>
<salad />
<soup />
<main-dish />
<dessert />
</dinner>
</menu>

There it is, processed with XALAN-J. I'm still new to Java, so I won't be able
to help you debug your program, but the problem is clearly not XSL and you may
do better posting to the XALAN-J list to get pointers programming those
classes.

Unfortunately, this isn't doing what I need to do. This XSL creates a
completely new DOM document with a 'menu' root. I need to put a series of
nodes into an existing document at a specific node beneath the root.

I want the root node to be any currently existing element in my DOM tree. I
can control the choice of which node is my parent in the destination tree,
but if I try to put more than one node under that parent element, I get this
error, even though I don't think the error is correct.

I understand that I can't create a DOM document with more than one root
element, but that's not what I'm trying. I already have the DOM document,
and I want to put a series of nodes under a child element of that DOM
document...

Thanx,
   Steve



 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list