如何使用 Rhino 中的 SOAP Web 服务响应处理 ServerSide XSLT?
How to process ServerSide XSLT using SOAP web service response from within Rhino?
我正在尝试使用来自 Rhino 的 SOAP Web 服务响应和基于文件的 XSLT 输入来执行服务器端转换。我的 JS 经验很少(但还在增加)JAVA。寻找一些关于如何将我发现的示例从使用基于 xml 输入的文件转换为 w/s SOAP 流的指示。
我的约束:
- 转换必须在运行服务器端而不是在客户端
- 必须在 Rhino 中完成
- 传入 XML 包含在我成功进入我的 JS 的 Web 服务 (SOAP) 响应中
- XSLT 在本地文件中
我已经能够追踪到以下来源/指针,但无法确定如何从我的服务器获取 xml soap 输入,而不是示例中的文件。
http://simonkissane.blogspot.ca/2013/06/xml-pretty-printing-and-xslt-processing.html
我的 JS 非常简单,请注意,获得 w/s 响应的部分使用 Jaggeryjs.org,这只是 Rhino
我的肥皂反应有效,打印(getBeerList()) returns 我期望的xml。
我失败了:var dsDoc = new javax.xml.transform.dom.DOMSource(doc);在函数 applyXSLT 中出现以下错误:
错误 {org.jaggeryjs.scriptengine.engine.RhinoEngine} - org.mozilla.javascript.JavaScriptException:内部错误:"javax.xml.transform.dom.DOMSource" 的 Java 构造函数未找到参数 "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 result;
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 result;
}
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>
与其使用 XML 从字符串创建 DOMSource
,我建议在 StringReader
上创建 StreamSource
https://docs.oracle.com/javase/7/docs/api/javax/xml/transform/stream/StreamSource.html多变的。然后您可以将该 StreamSource 传递给 Transformer。
我正在尝试使用来自 Rhino 的 SOAP Web 服务响应和基于文件的 XSLT 输入来执行服务器端转换。我的 JS 经验很少(但还在增加)JAVA。寻找一些关于如何将我发现的示例从使用基于 xml 输入的文件转换为 w/s SOAP 流的指示。
我的约束:
- 转换必须在运行服务器端而不是在客户端
- 必须在 Rhino 中完成
- 传入 XML 包含在我成功进入我的 JS 的 Web 服务 (SOAP) 响应中
- XSLT 在本地文件中
我已经能够追踪到以下来源/指针,但无法确定如何从我的服务器获取 xml soap 输入,而不是示例中的文件。
http://simonkissane.blogspot.ca/2013/06/xml-pretty-printing-and-xslt-processing.html
我的 JS 非常简单,请注意,获得 w/s 响应的部分使用 Jaggeryjs.org,这只是 Rhino
我的肥皂反应有效,打印(getBeerList()) returns 我期望的xml。
我失败了:var dsDoc = new javax.xml.transform.dom.DOMSource(doc);在函数 applyXSLT 中出现以下错误:
错误 {org.jaggeryjs.scriptengine.engine.RhinoEngine} - org.mozilla.javascript.JavaScriptException:内部错误:"javax.xml.transform.dom.DOMSource" 的 Java 构造函数未找到参数 "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 result;
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 result;
}
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>
与其使用 XML 从字符串创建 DOMSource
,我建议在 StringReader
上创建 StreamSource
https://docs.oracle.com/javase/7/docs/api/javax/xml/transform/stream/StreamSource.html多变的。然后您可以将该 StreamSource 传递给 Transformer。