Java XML Transform getTransformedText(File doc, File xsl, Object[] params)

Here you can find the source of getTransformedText(File doc, File xsl, Object[] params)

Description

Transform an XML file using an XSL file and an array of parameters.

License

Open Source License

Parameter

Parameter Description
doc the document to transform.
xsl the XSL transformation program.
params the array of transformation parameters.

Return

the transformed text.

Declaration

public static String getTransformedText(File doc, File xsl, Object[] params) throws Exception 

Method Source Code

//package com.java2s;
/*---------------------------------------------------------------
*  Copyright 2005 by the Radiological Society of North America
*
*  This source software is released under the terms of the
*  RSNA Public License (http://mirc.rsna.org/rsnapubliclicense)
*----------------------------------------------------------------*/

import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;

import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import java.io.File;

import java.io.StringWriter;

public class Main {
    /**/*from  ww w  .ja  va2s  .  co  m*/
     * Transform an XML file using an XSL file and an array of parameters.
     * The parameter array consists of a sequence of pairs of (String parametername)
     * followed by (Object parametervalue) in an Object[].
     * @param doc the document to transform.
     * @param xsl the XSL transformation program.
     * @param params the array of transformation parameters.
     * @return the transformed text.
     */
    public static String getTransformedText(File doc, File xsl, Object[] params) throws Exception {
        return getTransformedText(new StreamSource(doc), new StreamSource(xsl), params);
    }

    /**
     * Transform an XML DOM Document using an XSL file and an array of parameters.
     * The parameter array consists of a sequence of pairs of (String parametername)
     * followed by (Object parametervalue) in an Object[].
     * @param doc the document to transform.
     * @param xsl the XSL transformation program.
     * @param params the array of transformation parameters.
     * @return the transformed text.
     */
    public static String getTransformedText(Document doc, File xsl, Object[] params) throws Exception {
        return getTransformedText(new DOMSource(doc), new StreamSource(xsl), params);
    }

    /**
     * Transform an XML document using an XSL DOM document and an array of parameters.
     * The parameter array consists of a sequence of pairs of (String parametername)
     * followed by (Object parametervalue) in an Object[].
     * @param doc the document to transform.
     * @param xsl the XSL transformation program.
     * @param params the array of transformation parameters.
     * @return the transformed text.
     */
    public static String getTransformedText(Document doc, Document xsl, Object[] params) throws Exception {
        return getTransformedText(new DOMSource(doc), new DOMSource(xsl), params);
    }

    /**
     * General method for transformation to text. Transform a Source
     * document using a Source XSL document and an array of parameters.
     * The parameter array consists of a sequence of pairs of (String parametername)
     * followed by (Object parametervalue) in an Object[].
     * @param doc the document to transform.
     * @param xsl the XSL transformation program.
     * @param params the array of transformation parameters.
     * @return the transformed text.
     */
    public static String getTransformedText(Source doc, Source xsl, Object[] params) throws Exception {
        TransformerFactory tFactory = TransformerFactory.newInstance();
        Transformer transformer = tFactory.newTransformer(xsl);
        if ((params != null) && (params.length > 1)) {
            for (int i = 0; i < params.length; i = i + 2) {
                transformer.setParameter((String) params[i], params[i + 1]);
            }
        }
        StringWriter sw = new StringWriter();
        transformer.transform(doc, new StreamResult(sw));
        return sw.toString();
    }

    /**
     * Make a String from an XML DOM Node.
     * @param node the node at the top of the tree.
     * @return the XML string for the node and its children.
     * If the node is a DOCUMENT_NODE, the string includes
     * an XML declaration specifying an encoding of UTF-8.
     */
    public static String toString(Node node) {
        StringBuffer sb = new StringBuffer();
        renderNode(sb, node);
        return sb.toString();
    }

    private static void renderNode(StringBuffer sb, Node node) {
        if (node == null) {
            sb.append("null");
            return;
        }
        switch (node.getNodeType()) {

        case Node.DOCUMENT_NODE:
            sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
            Node root = ((Document) node).getDocumentElement();
            renderNode(sb, root);
            break;

        case Node.ELEMENT_NODE:
            String name = getNodeNameWithNamespace(node);
            NamedNodeMap attributes = node.getAttributes();
            if (attributes.getLength() == 0) {
                sb.append("<" + name + ">");
            } else {
                sb.append("<" + name + " ");
                int attrlen = attributes.getLength();
                for (int i = 0; i < attrlen; i++) {
                    Node attr = attributes.item(i);
                    String attrName = getNodeNameWithNamespace(attr);
                    sb.append(attrName + "=\"" + escapeChars(attr.getNodeValue()));
                    if (i < attrlen - 1)
                        sb.append("\" ");
                    else
                        sb.append("\">");
                }
            }
            NodeList children = node.getChildNodes();
            if (children != null) {
                for (int i = 0; i < children.getLength(); i++) {
                    renderNode(sb, children.item(i));
                }
            }
            sb.append("</" + name + ">");
            break;

        case Node.TEXT_NODE:
            sb.append(escapeChars(node.getNodeValue()));
            break;

        case Node.CDATA_SECTION_NODE:
            sb.append("<![CDATA[" + node.getNodeValue() + "]]>");
            break;

        case Node.PROCESSING_INSTRUCTION_NODE:
            sb.append("<?" + node.getNodeName() + " " + escapeChars(node.getNodeValue()) + "?>");
            break;

        case Node.ENTITY_REFERENCE_NODE:
            sb.append("&" + node.getNodeName() + ";");
            break;

        case Node.DOCUMENT_TYPE_NODE:
            // Ignore document type nodes
            break;

        case Node.COMMENT_NODE:
            sb.append("<!--" + node.getNodeValue() + "-->");
            break;
        }
        return;
    }

    private static void renderNode(StringBuffer sb, Node node, String margin, String indent, String lab, String rab,
            String nl) {
        if (node == null) {
            sb.append("null");
            return;
        }
        switch (node.getNodeType()) {

        case Node.DOCUMENT_NODE:
            //sb.append(margin + lab +"?xml version=\"1.0\" encoding=\"UTF-8\"?" + rab + nl);
            Node root = ((Document) node).getDocumentElement();
            renderNode(sb, root, margin, indent, lab, rab, nl);
            break;

        case Node.ELEMENT_NODE:
            String name = getNodeNameWithNamespace(node);
            NodeList children = node.getChildNodes();
            int nChildren = children.getLength();
            NamedNodeMap attributes = node.getAttributes();
            int nAttrs = attributes.getLength();

            boolean singleShortTextChild = (nAttrs == 0) && (nChildren == 1)
                    && (children.item(0).getNodeType() == Node.TEXT_NODE)
                    && (children.item(0).getTextContent().length() < 70)
                    && (!children.item(0).getTextContent().contains("\n"));

            if (singleShortTextChild) {
                sb.append(margin + lab + name + ((nChildren == 0) ? "/" : "") + rab);
            } else if (nAttrs == 0 && !singleShortTextChild) {
                sb.append(margin + lab + name + ((nChildren == 0) ? "/" : "") + rab + nl);
            } else if (nAttrs == 1) {
                Node attr = attributes.item(0);
                String attrName = getNodeNameWithNamespace(attr);
                sb.append(margin + lab + name + " " + attrName + "=\"" + escapeChars(attr.getNodeValue()) + "\""
                        + ((nChildren == 0) ? "/" : "") + rab + nl);
            } else {
                sb.append(margin + lab + name + nl);
                for (int i = 0; i < nAttrs; i++) {
                    Node attr = attributes.item(i);
                    String attrName = getNodeNameWithNamespace(attr);
                    sb.append(margin + indent + attrName + "=\"" + escapeChars(attr.getNodeValue()));
                    if (i < nAttrs - 1)
                        sb.append("\"" + nl);
                    else
                        sb.append("\"" + ((nChildren == 0) ? "/" : "") + rab + nl);
                }
            }
            if (singleShortTextChild) {
                String text = escapeChars(node.getTextContent());
                sb.append(text.trim());
                sb.append(lab + "/" + name + rab + nl);
            } else {
                for (int i = 0; i < nChildren; i++) {
                    renderNode(sb, children.item(i), margin + indent, indent, lab, rab, nl);
                }
            }
            if (nChildren != 0 && !singleShortTextChild)
                sb.append(margin + lab + "/" + name + rab + nl);
            break;

        case Node.TEXT_NODE:
            String text = escapeChars(node.getNodeValue());
            String[] lines = text.split("\n");
            for (String line : lines) {
                line = line.trim();
                if (!line.equals(""))
                    sb.append(margin + line + nl);
            }
            break;

        case Node.CDATA_SECTION_NODE:
            String cdataText = node.getNodeValue();
            String[] cdataLines = cdataText.split("\n");
            sb.append(margin + lab + "![CDATA[" + nl);
            for (String line : cdataLines) {
                line = line.trim();
                if (!line.equals(""))
                    sb.append(margin + indent + line + nl);
            }
            sb.append(margin + "]]" + rab + nl);
            break;

        case Node.PROCESSING_INSTRUCTION_NODE:
            sb.append(margin + lab + "?" + node.getNodeName() + " " + escapeChars(node.getNodeValue()) + "?" + rab
                    + nl);
            break;

        case Node.ENTITY_REFERENCE_NODE:
            sb.append("&" + node.getNodeName() + ";");
            break;

        case Node.DOCUMENT_TYPE_NODE:
            // Ignore document type nodes
            break;

        case Node.COMMENT_NODE:
            sb.append(margin + lab + "!--" + node.getNodeValue() + "--" + rab + nl);
            break;
        }
        return;
    }

    private static String getNodeNameWithNamespace(Node node) {
        String name = node.getNodeName();
        String ns = node.getNamespaceURI();
        String prefix = (ns != null) ? node.lookupPrefix(ns) : null;
        if ((prefix != null) && !name.startsWith(prefix + ":")) {
            name = prefix + ":" + name;
        }
        return name;
    }

    /**
     * Escape the ampersand, less-than, greater-than, single and double quote
     * characters in a string, replacing with their XML entities.
     * @param theString the string to escape.
     * @return the modified string.
     */
    public static String escapeChars(String theString) {
        return theString.replace("&", "&amp;").replace(">", "&gt;").replace("<", "&lt;").replace("\"", "&quot;")
                .replace("'", "&apos;");
    }

    /**
     * Get the text content of an element identified by a path,
     * where the path elements can include an index. The first
     * path element must not have an index, and its name must
     * match the name of the starting node. If the starting
     * node is a Document, the root Element of the document is
     * used as the starting point. Path elements must be separated
     * by the slash character. If the path starts with a slash,
     * the slash is ignored. If the element or attribute identified
     * by the path is not present as a child of the starting node,
     * the empty string is returned. If a path element identifies
     * an attribute, any subsequent path elements are ignored.
     * A path is in the form: /e1/e2/e3/... or /e1/e2/@attr
     * Note the slash preceding the attribute's @-sign.
     * @param node the starting node for the path. The first path
     * element must match the name of this node.
     * @param path the path to the target node.
     * @return the full text value of the target node (including all
     * descendent text nodes), or the empty string if the target is
     * not a descendent of the starting node.
     */
    public static String getTextContent(Node node, String path) {
        if (node instanceof Document)
            node = ((Document) node).getDocumentElement();
        if (!(node instanceof Element))
            return "";
        Element el = (Element) node;
        path = path.replaceAll("\\s", "");
        if (path.startsWith("/"))
            path = path.substring(1);
        String[] pathElements = path.split("/");
        if (!pathElements[0].equals(el.getTagName()))
            return "";
        for (int i = 1; i < pathElements.length; i++) {
            String pe = pathElements[i];
            if (pe.startsWith("@")) {
                //If this path element identifies an attribute, return it
                //and ignore any further path elements.
                return el.getAttribute(pe.substring(1));
            } else {
                //This path element identifies an Element. It may have an index.
                //Get the index, if present, and get the element name.
                int n = 0;
                int k = pe.indexOf("[");
                int kk = pe.lastIndexOf("]");
                if ((k != -1) && (k < kk)) {
                    try {
                        n = Integer.parseInt(pe.substring(k + 1, kk));
                    } catch (Exception ex) {
                        return "";
                    }
                    pe = pe.substring(0, k);
                } else if (k != kk)
                    return "";
                //We now have the element name and the index.
                //Find the identified Element. We have to count
                //matching elements to find the one identified
                //by the index.
                int nn = 0;
                Node child = el.getFirstChild();
                while (child != null) {
                    if ((child.getNodeType() == Node.ELEMENT_NODE) && child.getNodeName().equals(pe)) {
                        if (n == nn)
                            break;
                        nn++;
                    }
                    child = child.getNextSibling();
                }
                //If the child is null, we didn't find the identified Element.
                if (child == null)
                    return "";
                //If we get here, we found it, now look for the next one.
                el = (Element) child;
            }
        }
        //Okay, we must be at the end of the path, and it must be an Element.
        //Return the text content of the element.
        return el.getTextContent();
    }
}

Related

  1. getDefaultTransformerFactoryThreadLocal()
  2. getNewTransformer()
  3. getThreadedIdentityTransformer( boolean omitXmlDeclaration)
  4. getThreadedIdentityTransformer(final boolean omitXmlDeclaration)
  5. getThreadedTransformer(final boolean omitXmlDeclaration, final boolean standalone, final Map threadMap, final String xslURL)
  6. getTransformer()
  7. getTransformer()
  8. getTransformer()
  9. getTransformer()