【问题标题】:Fetching data from xml Using Xquery with starts with function从 xml 中获取数据使用 Xquery 以函数开头
【发布时间】:2015-08-06 00:46:28
【问题描述】:

我想从 xml 中获取数据使用 Xquery with started with function。

数据.xml

              <data><employee id=\"1\"><name value=\"vA-12\">A</name> <title id=\"2\">Manager</title></employee>
                    <employee id=\"2\"><name value=\"vC-12\">C</name><title id=\"2\">Manager</title></employee>
                    <employee id=\"2\"><name value=\"vB-12\">B</name><title id=\"2\">Manager</title></employee>
             </data>

现在我想获取具有 employee@id=title@id 和 name@value 以“vC”开头的名称。

我已经为此编写了这个 xquery。请参见下文,但出现错误-

for $x in /data/employee where $x/@id=$x/title/@id and [fn:starts-with($x/name/@value,vC)] return data($x/name)

这是错误-

    Error on line 1 column 55 
  XPST0003 XQuery syntax error near #.../title/@id and [fn:starts-with#:
    Unexpected token "[" in path expression
net.sf.saxon.s9api.SaxonApiException: Unexpected token "[" in path expression
    at net.sf.saxon.s9api.XQueryCompiler.compile(XQueryCompiler.java:544)
    at Xml.process(Xml.java:46)
    at Xml.main(Xml.java:30)
Caused by: net.sf.saxon.trans.XPathException: Unexpected token "[" in path expression
    at net.sf.saxon.query.XQueryParser.grumble(XQueryParser.java:479)
    at net.sf.saxon.expr.parser.XPathParser.grumble(XPathParser.java:221)

【问题讨论】:

  • @Andrew 添加错误请见上文
  • 您的 xml 格式是否不正确(属性值中的转义)?
  • @DimitreNovaatchev 非常感谢你

标签: java xml xquery


【解决方案1】:

starts-with() 函数需要两个参数。我不熟悉撒克逊人,但一般 xquery 你可以这样做:

for $x in /data/employee[@id=title/@id and name[starts-with(@value,'vC')]] 
return data($x/name)

或使用where 子句而不是for 子句中的谓词,就像您尝试的查询一样:

for $x in /data/employee
where $x/@id=$x/title/@id and $x/name/starts-with(@value,'vC')
return data($x/name)

【讨论】:

    【解决方案2】:

    只需使用这个更短更简单的 XPath 2.0 单行代码

    /*/employee[@id eq title/@id and starts-with(name/@value, 'vC')]/data(name)
    

    【讨论】:

      【解决方案3】:

      根据您的确切要求,您可能需要这个(我让您了解差异,但基本上它选择以@value 开头的所有名称,以vC 开头,这里的其他解决方案选择所有员工的所有名称至少有一个以vC 开头的名称):

      /data/employee[@id eq title/@id]/name[starts-with(@value, 'vC')]/data(.)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多