Pass document as parameter to XSL Translation in Java

后端 未结 4 1618
无人及你
无人及你 2021-01-12 11:01

I\'m working on addition internationalization to my XSL. I\'ve seen plenty of examples of creating a dictionary.xml file and loading it into my XSL via document(\'dictionar

相关标签:
4条回答
  • 2021-01-12 11:37

    Ok, I made a skeleton copy of your code. This is going to sound bizarre, but after you create your dictionary document in the java code, and before you set it as a parameter for the transformer, just invoke the method:

    dictionary.getDocumentElement();
    

    then it works! Looks like a bug in the way saxon is handling a parameter thats a document, where it requires some kind of initialisation which hasnt been done ? I'm not digging into the debugger.

    0 讨论(0)
  • 2021-01-12 11:38

    Does changing

    select="$dictionary
    

    to

    select="node-set($dictionary)
    

    help ?

    0 讨论(0)
  • 2021-01-12 11:39

    Passing a DOM Document node as a parameter to a Saxon transformation should work (DOM is not the most efficient tree representation, by a long way, but it should work). So should passing DOMSource that wraps the DOM Document. I usually start by doing xsl:copy-of select="$doc", and you seem to have done this and confirmed that the value is being passed in correctly. If you're not getting anything in response to XPath selections within the document, this usually means that the XPath expressions are wrong. The most usual reasons are forgetting about the root (document) node, and forgetting about namespaces. But I'm afraid there's no evidence of such mistakes in the code you have shown us - assuming the DOM reflects the XML you have shown in your post.

    Your post suggests that you have build the DOM Document programmatically. It's possible that you have created a DOM that Saxon can't process for some reason: DOM interfaces are not very robust and there are sometimes difficulties when people use a DOM implementation that hasn't been tested with Saxon.

    You could also test your stylesheet by running it from the command line - you can supply the value of the $dictionary parameter using +dictionary=dict.xml (the leading '+' causes it to be recognized as the name of a file that needs to be parsed).

    0 讨论(0)
  • 2021-01-12 11:54

    Use a URIResolver instead of a parameter. First, create the resolver like this:

    public class DocURIResolver implements URIResolver {
    
        final Map<String, Document> documents;
    
        public DocURIResolver(final Map<String, Document> documents) {
            this.documents = documents;
        }
    
        public Source resolve(final String href, final String base) {
            final Document doc = documents.get(href);
            return (doc != null) ? new DOMSource(doc) : null;
        }
    }
    

    Use it like this:

    Document dictionary = TranslationDictionary.getDictionaryDocument();
    Map<String, Document> docs = new HashMap<String, Document>();
    docs.put("dictionary", dictionary);
    // transformer is your javax.xml.transform.Transformer
    transformer.setURIResolver(new DocURIResolver(docs));
    

    And reference it in your stylesheet by name:

    <xsl:variable name="dict" select="document('dictionary')"/>
    

    This is just a toy example, of course. You can make your URIResolver as full-featured as necessary.

    0 讨论(0)
提交回复
热议问题