2017-12-13 7 views
1

Ich habe ein Problem festgestellt. Ich muss XML mit XSLT 2.0 (SAXON-HE 9.8.0 Prozessor) in Java umwandeln. In meinem XSLT verwende ich (über Import) externe Funktionen von functx.XSLT mit externen Funktionen (functx) im Speicher

Wenn beide Dateien (Xslt Karte und XSL-Datei mit functx) sind im selben Verzeichnis alles fein funktioniert. In meinem .xsl wird functx korrekt importiert und es funktioniert:

xmlns: functx = "http://www.functx.com"

xsl: import href = "functx-Paket. xsl“

gibt es eine Möglichkeit zu Verwendung externer Funktionen von functx in meiner .xsl Karte, wenn beide Dateien im Speicher als String Objekte oder Inputstreams oder was auch immer sind?

Ich kann die Dateien auf dem Laufwerk nicht wie zuvor in einem Verzeichnis speichern.

Die einzige Möglichkeit, die mein Problem beheben könnte, ist functx Datei in meine .xsl Mapper einfügen, aber das ist eine falsche Lösung - [sehr] schlechte Praxis.

Was ich benutze:

  • Java 7
  • SAXON-HE 9.8.0 Prozessor
  • XSLT 2,0

Antwort

3

Versorgung einen Compiler-URIResolver mit der Logik

public Source resolve(String href, String base) { 
    if (href.equals("functx-package.xsl")) { 
    return new StreamSource(new StringReader(functxAsString)); 
    } else { 
    return null; 
    } 
} 

Der Kompilierzeit URIResolver ist der eine an den XsltCompiler geliefert, wenn Sie s9api verwenden, oder an die TransformerFactory, wenn Sie JAXP verwenden.

0

Fazit:

import documentation from Saxon

dieses Resolver nutzen zu können, müssen wir Set es in unserem TransformerFactory. Dann wird jeder Transformer im Import auf href zugreifen und die Datei mit unseren .xsl-Dateien als Zeichenfolgen abgleichen. Ich verwende outputURIResolver, um die Ausgabe abzufangen und mehrere Dateien im Speicher zu erstellen. (Interessante Nutzung von outputURIResolver - link)

Beispiel:

in XSL-Datei:

<xsl:import href="functx-package.xsl"/> 
<xsl:import href="functs-package.xsl"/> 

in java:

TransformerFactory tFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", XMLviaXSLTransformer.class.getClassLoader()); 

    tFactory.setURIResolver(new URIResolver() { 
     @Override 
     public Source resolve(String href, String base) { 
      if (href.equals("functx-package.xsl")) { 
       return new StreamSource(new StringReader(finalFunctsAsString)); 
      } else if (href.equals("functs-package.xsl")) { 
       return new StreamSource(new StringReader(finalFunctxAsString)); 
      } else { 
       return null; 
      } 
     } 
    }); 

    Transformer transformer = tFactory.newTransformer(xsltMap); 
    StreamResult standardResult = new StreamResult(new ByteArrayOutputStream()); 
    transformer.transform(xmlInput, standardResult); 

Danke Michael um Hilfe. Dieser URIResolver ist sehr leistungsfähig.

Verwandte Themen