|
Subject: RE: [xsl] Generating XML fragment to DOM node using XSL From: "Josh Canfield" <josh.canfield@xxxxxxxxxxxx> Date: Tue, 16 Dec 2003 16:02:50 -0800 |
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@xxxxxxxxx]
Sent: Tuesday, December 16, 2003 1:10 PM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: [xsl] Generating XML fragment to DOM node using XSL
On 12/16/03 12:49 PM, "cknell@xxxxxxxxxx" <cknell@xxxxxxxxxx> 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
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] Generating XML fragment t, Stan Devitt | Thread | Re: [xsl] Generating XML fragment t, Steve Dussinger |
| Re: [xsl] Generating XML fragment t, Stan Devitt | Date | [xsl] Sum a group of transactions, , kakridge |
| Month |