【问题标题】:How to use tokenize function in Xpath如何在 Xpath 中使用 tokenize 函数
【发布时间】:2022-01-04 10:56:13
【问题描述】:

我们可以在 XPath 中使用 tokenize 函数吗

我用来处理 XSLT 和 XML 文件的一般 java 代码是:

XPath xPath = XPathFactory.newInstance().newXPath();
InputSource inputXML = new InputSource(new StringReader(xml));
String expression = "/root/customer/personalDetails[age=tokenize('20|30','|')]/name";
boolean evaluate1 = (boolean) xPath.compile(expression).evaluate(inputXML, XPathConstants.BOOLEAN);

XML :-

<?xml version="1.0" encoding="ISO-8859-15"?>
<root>
    <customer>
        <personalDetails>
            <name>ABC</name>
            <value>20</value>
        </personalDetails>
        <personalDetails>
            <name>XYZ</name>
            <value>21</value>
        </personalDetails>
        <personalDetails>
            <name>PQR</name>
            <value>30</value>
        </personalDetails>
    </customer>
</root>

预期响应:- ABC,PQR

【问题讨论】:

  • 您的 xslt 与 xml 不匹配(age vs value)。关于tokenize:tokenize返回一个字符串序列,你真的可以用=比较吗?
  • tokenize 是 XPath 2 及更高版本的一部分,因此倾向于仅实现 XPath 1 的默认 JAXP XPath API 不支持它。但是,Saxon 9 或 10 可以在 Java 中使用,以支持 XPath 3。不建议使用 JAXP API 执行此操作,特别是如果您想要不适合该 API 的结果。您的代码不清楚,似乎假设 XPath 2,您只想要 /root/customer/personalDetails[value=(20, 30)]/name 但当然作为节点列表而不是布尔值。

标签: java xml xslt xpath xslt-3.0


【解决方案1】:

是的,您可以在 XPath 中使用 tokenize() 函数,前提是您的 XPath 处理器支持 XPath 2.0 或更高版本。

对于 Java,XPath 2.0+ 处理器的流行选择是 Saxon。

您可以将 JAXP API 与 Saxon 一起使用,但是,它并不能真正与 XPath 2.0+ 一起使用,因此最好使用 Saxon 自己的 API(称为 s9api)。

对于这个特定示例,您不需要tokenize()。在 XPath 2.0+ 中你可以写

[age=('20', '30')]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 2022-01-16
    • 2015-01-13
    • 1970-01-01
    • 2012-01-23
    • 2014-07-15
    相关资源
    最近更新 更多