|
Subject: Re: [xsl] Generating XML fragment to DOM node using XSL From: Steve Dussinger <sdussing@xxxxxxxxx> Date: Wed, 17 Dec 2003 09:26:19 -0800 |
On 12/16/03 4:02 PM, "Josh Canfield" <josh.canfield@xxxxxxxxxxxx> wrote:
> 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
>
Thank you. This is precisely what I was looking for. I had the same problem
you did when trying to use an Element as the DOMResult, that's what
originally precipitated my posting.
The part I was missing was creating the DocumentFragment. It seems so simple
in hindsight.
I'm still of the opinion that this is a bug in Xalan. I'll post something to
BugZilla over the weekend...
Thanx again everyone...
--Steve
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| RE: [xsl] Generating XML fragment t, Josh Canfield | Thread | RE: [xsl] Generating XML fragment t, Joseph Kesselman |
| Re: [xsl] Literal result element na, David Carlisle | Date | [xsl] Insert refs, Ricardo Saraiva |
| Month |