XQuery查找匹配属性的子项为空的元素

时间:2016-05-31 11:01:32

标签: xml xquery

我有一个XML文件,我试图提取元素书籍和期刊的标题,其中ID和IDREF的匹配产品在评论中没有价值。

所以我看到的XML文件看起来像这样:

<bookshop>
    <product ID="185.3.16">
        <price currency="AU$">56.85</price>
        <comments>Best sell</comments>
    </product>
    <product ID="163.24.12">
        <price currency="NZ$">28.6</price>
        <comments />
    </product>
    <product ID="332.17.25">
        <price currency="US$">19.95</price>
        <comments></comments>
    </product>
    <book IDREF="163.24.12">
        <title>Core Java</title>
    </book>
    <book IDREF="185.3.16">
        <title>C++ Development</title>
    </book>
    <journal IDREF="332.17.25">
        <title>Mathematics and Computing</title>
    </journal>
</bookshop>

我想要实现的输出是:

<title>Core Java</title>
<title>Mathematics and Computing</title>

因为C ++开发的IDREF书与其子评论没有价值的产品的ID相匹配。

我尝试使用xquery创建一个脚本,方法是尝试查找具有不同ID属性的所有元素产品,其中子注释也为空,但我在尝试查找没有注释的产品时遇到问题,然后将这些结果翻译成我可以返回的内容。 (在我能解决产品问题之前,我无法给予正确的回报,所以我无法对此产生很大的回旋余地。)但这是我迄今为止所尝试过的:

for $id in distinct-values(//product/@ID)
where count(//product/comments/text()) > 0
return ...?

非常感谢任何帮助。

提前致谢!

1 个答案:

答案 0 :(得分:0)

  

&#34;我正在尝试提取元素书籍和期刊的标题,其中ID和IDREF的匹配产品在评论中没有价值&#34;

这是一个可能返回您所述问题的XPath:

/bookshop/*[@IDREF = /bookshop/product[normalize-space(comments) = '']/@ID]/title

如果您只想选择bookjournal,只需在[self::book | self::journal]之后添加谓词:/*

<强> xpathtester demo

输出

<title>Core Java</title>

<title>Mathematics and Computing</title>

更新:

目前还不清楚限制(您可以使用哪种XPath表达式)。假设您不允许使用XPath谓词([]),可以将其替换为where子句,如下所示:

declare variable emptyProductIDs := /bookshop/product[not(comments/text())]/@ID

for $element in /bookshop/*
where $element/@IDREF = $emptyProductIDs
return $element/title