我有一个 xsl 片段:
<GOGO>
<xsl:variable name="test">
<xsl:copy-of select="response"/>
</xsl:variable>
<xsl:copy-of select="javamap:echo($test)"/>
</GOGO>
这段代码调用了一个 java 方法:
public static String echo(String a) {
System.out.println("HERE I AM:"+a+":");
return "<xxx>" + a + "</xxx>";
}
如果我只有以下片段:
<GOGO>
<xsl:copy-of select="response"/>
</GOGO>
结果转换类似于:
<foo>val1</foo>
<bar>val2</bar>
但是当Java方法被调用时,system out的输出是意想不到的,只是打印出来:
val1
val2
我做错了什么以及如何让 java 方法输出预期的 xml 片段?
编辑: 回答帮助我的人的问题: 我正在使用 Saxon9。 另一个线程中的某人向我展示了 value-of 和 disable-output-escaping="yes"的使用,这使我能够在输出中打印出 xxx 元素标签。但是,我仍然对输入端感到困惑,我希望我的 java 类能够充分了解我传递给它的完整 xml 片段。
foo 和 bar 标签是我要传递给 java 函数的 xml。在 java 函数中,我想进一步将 xml 包装在 xxx 标记中。
编辑 2: 下面的提示让我得出以下解决方案: public static String echo(Node a) 抛出异常{
StringWriter writer = new StringWriter();
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(a), new StreamResult(writer));
String xml = writer.toString();
return xml;
}
最佳答案
扩展函数的语义取决于你使用的处理器,你没有告诉我们,但我认为任何处理器都不太可能按照你期望的方式工作——也就是说,处理返回的字符串通过一个函数作为词法 XML 进行解析并转换为节点。如果你想返回一个节点,你必须在返回之前构造一个节点。节点的种类(例如,它是否是 DOM 节点,它属于什么文档等)将取决于系统;总的来说,我建议不要在扩展函数中操作节点 - XSLT 做得更好。
关于java - XSLT 调用嵌入了 XML 的 java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13822212/