Как обработать серверный XSLT с помощью ответа веб-службы SOAP из Rhino?

#javascript #java #xslt #rhino #jaggery-js

#javascript #java #xslt #носорог #jaggery-js #rhino

Вопрос:

Я пытаюсь выполнить преобразование на стороне сервера, используя ввод ответа веб-службы SOAP и XSLT на основе файлов из Rhino. У меня очень мало (но растет) опыта работы с JAVA / JS. Ищу несколько указаний о том, как преобразовать образец, который я нашел, из использования XML-ввода на основе файла в поток w / s SOAP.

Мои ограничения:

  1. Преобразование должно выполняться на стороне сервера, а не на клиенте
  2. должно быть выполнено в Rhino
  3. Входящий XML содержится в ответе веб-службы (SOAP), который я успешно получаю в своем JS
  4. XSLT находится в локальном файле

Я смог отследить следующие источники / указатель, но не могу определить, как получить ввод xml soap с моего сервера по сравнению с файлом, как в примере.

http://simonkissane.blogspot.ca/2013/06/xml-pretty-printing-and-xslt-processing.html

Мой JS довольно прост, обратите внимание, что часть, получающая ответ w / s, использует Jaggeryjs.org , который является просто Носорогом

Мой ответ soap работает, print(getBeerList()) возвращает ожидаемый XML.

Я терплю неудачу в: var dsDoc = new javax.xml.transform.dom.DOMSource(doc); внутри функции applyXSLT со следующей ошибкой:

ОШИБКА {org.jaggeryjs.scriptengine.engine.RhinoEngine} — org.mozilla.javascript.JavaScriptException: InternalError: конструктор Java для «javax.xml.transform.dom.DOMSource» с аргументами «string» не найден. (/TestJaggery_1//index.jag#90) (/TestJaggery_1//index.jag#108)

JS — код:

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    //stuff removed
</head>

<body>
        <!-- Le javascript
        ================================================== -->
        <!-- Placed at the end of the document so the pages load faster -->
        <script src="js/jquery.min.js"></script>
        <script src="js/bootstrap.js"></script>
        <script src="js/util.js"></script>
</body>

<%

function getBeerList() {
        var log = new Log();
        var ws = require('ws');

        var mylist = new ws.WSRequest();
        var options = new Array();
        options.useSOAP = 1.2;
        options.useWSA = 1.0;
        options.action = "getAll";
        var payload = null;
        var resu<

        try {
            mylist.open(options, "http://192.168.1.204:9764/services/TestSheet/", false);
            mylist.send(payload);
            result = mylist.responseText;
        } catch (e)
        {
            log.error(e.toString());
            print(mylist.error)
            return e.toString();
        }
        return resu<
    }

    print(getBeerList()); 

xmlToString = function(doc) {
   var domreg = org.w3c.dom.bootstrap.DOMImplementationRegistry.newInstance();
   var ls = domreg.getDOMImplementation("LS");
   var w = ls.createLSSerializer();
   w.getDomConfig().setParameter("format-pretty-print", true);
   var lsout = ls.createLSOutput();
   var out = new java.io.StringWriter();
   lsout.setCharacterStream(out);
   w.write(doc, lsout);
   out.close();
   return ""   out.toString();
};

getDocBuilder = function() {
   var dbf = javax.xml.parsers.DocumentBuilderFactory.newInstance();
   dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
   dbf.setNamespaceAware(true);
   return dbf.newDocumentBuilder();
};

loadXMLFile = function(file) {
   var inp = new java.io.File(file);
   return getDocBuilder().parse(inp);
};

applyXSLT = function(doc, xslt) {
   //the following line is failing
   var dsDoc = new javax.xml.transform.dom.DOMSource(doc);
   var dsXSLT = new javax.xml.transform.dom  .DOMSource(xslt);
   var tf = javax.xml.transform.TransformerFactory.newInstance();
   var xf = tf.newTransformer(dsXSLT);
   var out = getDocBuilder().newDocument();
   var drOut = new javax.xml.transform.dom.DOMResult(out);
   xf.transform(dsDoc, drOut);
   return out;
};

try {
   //doc is where I am unsure of how to insert my SOAP response 'getBeerList()'
   var doc = getBeerList();
   var xslt = loadXMLFile(PathtoMyLocalFile);
   var out = applyXSLT(doc, xslt);
   println(xmlToString(out));
} catch (e) {
   if (e.javaException)
      e.javaException.printStackTrace();
   throw e;
}   

%>

</html>
  

Ответ №1:

Вместо создания a DOMSource из вашей строки с помощью XML я бы предложил создать StreamSource https://docs.oracle.com/javase/7/docs/api/javax/xml/transform/stream/StreamSource.html над строковой StringReader переменной over you. Затем вы можете передать этот источник потока в Transformer.