【问题标题】:XQuery function to fetch value from XML using XPath dynamicallyXQuery 函数使用 XPath 从 XML 中动态获取值
【发布时间】:2018-02-05 21:07:59
【问题描述】:

如何在 XQuery 中编写一个函数以使用 XPath 在名为 x 的 XML 下面获取 Book 的价格?

    <Bookstore>
     <Book>
       <Name>A</Name>
       <Price>15</Price>
    </Book>
    <Book>
        <Name>B</Name>
        <Price>10</Price>
    </Book>
  </Bookstore>

要检索的 XPath 将使用如下名称值对

Bookstore/Book[Name/text()='A']/Price/text()

请帮忙

【问题讨论】:

  • 真的不清楚你在问什么。如果“x”只是一个字符串,给出了您要检索的书名,则将 x 声明为外部全局变量并使用Book[Name=$x](顺便说一下,不需要text())。你说你想评估一个动态提供的 XPath 表达式,但你没有说清楚为什么你认为你需要这个来解决这个特定的问题。
  • 我想要一个在 xml 中返回 xpath 值的函数。这个 xpath 本身应该作为参数传递给函数

标签: xml xpath xquery


【解决方案1】:

应该很简单:

/bookstore/book/price/text()

你试过了吗?

【讨论】:

  • 您好,这将返回 15 和 10。我只想返回 15。在这种情况下,我的 xpath 是正确的,但我希望它从配置文件作为输入发送到函数,该函数将通过使用 xpath tat 作为参数传递 XML 来返回值
【解决方案2】:

下面是一个示例,说明如何使用您的 XML 结构编写 XQuery 函数以通过书名获取图书价格:

xquery version "3.1";

declare function local:get-book-price($book-name as xs:string) as xs:string {
    let $bookstore := 
        <Bookstore>
            <Book>
                <Name>A</Name>
                <Price>15</Price>
            </Book>
            <Book>
                <Name>B</Name>
                <Price>10</Price>
            </Book>
        </Bookstore>
    return
        $bookstore/Book[Name eq $book-name]/Price/string()
};

local:get-book-price("A")

这将返回15

【讨论】:

    【解决方案3】:

    如果我对您的解释正确(但我仍然有困难),您正在寻找一个 eval() 函数,该函数采用字符串形式的 XPath 表达式,并对其进行评估,返回 XPath 表达式的结果。

    您的用例并不能解释您为什么需要这个,尽管有很多问题需要这样做。

    标准 XQuery 函数库中没有 eval() 函数。一些实现有一个,例如撒克逊有saxon:evaluate()。 XSLT 3.0 规范有一个标准指令xsl:evaluate - 因为需要建立评估上下文,所以它是一个指令而不是一个函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-06
      • 2022-01-04
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多