XSLT调用嵌入XML的Java

4

我有一个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方法时,系统输出令人意外,只打印出:
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) throws Exception {
    StringWriter writer = new StringWriter();
    Transformer transformer = TransformerFactory.newInstance().newTransformer();
    transformer.transform(new DOMSource(a), new StreamResult(writer));
    String xml = writer.toString();
    return xml;
}

好的。我猜测一个原因,你正在传递一个节点集,但是将其读取为字符串!当函数将其作为字符串参数读取时,只有值(文本)被加载! - Rookie Programmer Aravind
尝试将变量a定义为节点集而不是字符串!然后将其转换为字符串(希望innerHTML会将节点集转换为XML)。不知道是否有效,但值得一试! - Rookie Programmer Aravind
如果上面的评论解决了问题,请告诉我们,这样作者就可以将其发布为答案。如果不起作用,则提供一个SSCCE可能会帮助您获得答案。我个人觉得你的问题有点令人困惑,例如因为你的函数写入了xxx,但输出是foobar - MvG
你的提示给了我方向,我会在我的编辑中发布解决方案。 - Michael
1个回答

2
扩展函数的语义取决于您使用的处理器,但是您没有告诉我们。我认为任何处理器都不太可能按照您的预期工作 - 也就是说,将函数返回的字符串视为要解析并转换为节点的词法XML。如果您想返回一个节点,则必须在返回之前构造一个节点。节点的类型(例如它是DOM节点、属于哪个文档等)将取决于系统;总的来说,我建议不要在扩展函数中操作节点 - XSLT可以更好地完成这项工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接