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;
}
4

1 回答 1

2

扩展函数的语义取决于你正在使用的处理器,你没有告诉我们,但我认为任何处理器都不太可能按照你期望的方式工作——也就是说,处理函数返回的字符串作为要解析并转换为节点的词法 XML。如果要返回一个节点,则必须在返回之前构造一个节点。节点的类型(例如,它是否是 DOM 节点,它属于什么文档等)将取决于系统;总的来说,我建议不要在扩展函数中操作节点——XSLT 做得更好。

于 2012-12-11T17:04:15.957 回答