【问题标题】:TinyTextImpl insted of String xsltTinyText Impl 而不是 String xslt
【发布时间】:2017-10-12 15:06:07
【问题描述】:

我有以下 XML,

<outer.element>
<bold>
<csc>CSCTEXT</csc> 
REST OF THE TEXT
</bold>
</outer.element>,

我尝试检索 &lt;outer.element&gt; 元素标记内的文本并将其发送到 java 方法。我得到以下异常,

XPathException: 一个以上项目的序列不允许作为 class:method() 的第二个参数(“CSCTEXT”,“REST OF THE TEXT”)。

如果我在 java 方法签名中使用数组,我会得到以下异常,

“无法将 text() 类型的值类 net.sf.saxon.tinytree.TinyTextImpl 转换为 java.lang.String 类”

如何将单个连接值 (class:method() ("CSCTEXT REST OF THE TEXT")) 发送到 java 方法。?

提前谢谢你。

【问题讨论】:

  • 考虑展示最小但完整的 XSLT 和 Java 代码示例,以便我们重现问题,以及所使用的 Saxon 版本的精确描述。如果在 XSLT 中以 string(outer.element) 为参数调用方法会发生什么?
  • 诊断显示您使用的是 Saxon,所以我将其添加为问题标签。

标签: java xslt xml-parsing xslt-2.0 saxon


【解决方案1】:

第一个错误:

XPathException: 一个以上项目的序列不允许作为 class:method() 的第二个参数(“CSCTEXT”,“REST OF THE TEXT”)。

意味着您使用一系列值调用 Java 方法,而它只需要一个值。

在您的 Java 方法的签名中使用集合类往往意味着单个项目不会被转换,因此会出现第二个错误“无法转换...”。

一种解决方案是在函数调用中自己进行转换(例如,通过调用 data() 函数)。或者在 Java 方法中执行(在提供的项目上调用 getStringValue() 方法)。

如果我在 Java 中编写扩展函数,专门用于从 XPath/XSLT 调用,那么现在我将在方法签名中使用 Saxon 特定的类,例如 ZeroOrMore&lt;StringValue&gt;。然后,Saxon 将使用与本机 XSLT/XPath 函数完全相同的调用约定(例如,隐式原子化),并且您的被调用代码可以自行进行任何需要的进一步转换。

【讨论】:

    猜你喜欢
    • 2012-10-05
    • 1970-01-01
    • 2020-07-22
    • 2012-09-12
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多