我尝试在C#中使用Xquery FLOWR where语句:
for $x in //div[@class="class1"] where $x//span="data1" return $x 从xml文件中获取一些数据。(使用FLOWR的原因是为了方便地从外部文件读取查询运行时)
为此,我使用了Saxon API:http://www.saxonica.com/html/documentation/dotnet/dotnetapi.html
xml代码如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<doc>
<div class="class1">
<div class="class2">
<span class="class3">
data1
</span>
<span class="class4">
data2
</span>
</div>
<div class="class5">
data3
</div>
<div class="class6">
data4
</div>
</div>
<div class="class1">
<div class="class2">
<span class="class3">
data5
</span>
</div>
<div class="class5">
data6
</div>
</div>
</doc>
如果我使用X-base测试这段代码,它会像我预期的那样工作,并返回两个class1类中的一个;但是,Saxon和xpathtester.com都编译XQuery时没有出现错误,但返回为空。如果我删除了可选的where语句,它就会按预期运行。我是不是遗漏了什么?
发布于 2017-02-27 01:18:30
造成这种情况的原因是BaseX的CHOP option,它修剪文本节点末尾的所有空格。在启用CHOP (默认设置)的情况下导入到BaseX中时,您的文档看起来如下所示:
<doc>
<div class="class1">
<div class="class2">
<span class="class3">data1</span>
<span class="class4">data2</span>
</div>
<div class="class5">data3</div>
<div class="class6">data4</div>
</div>
<div class="class1">
<div class="class2">
<span class="class3">data5</span>
</div>
<div class="class5">data6</div>
</div>
</doc>因为=操作符对字符串是空格敏感的,所以where子句匹配被截断文档的文本内容,而不是原始文档的文本内容。
您可以裁剪查询中的空格,这在所有情况下都有效:
for $x in //div[@class = "class1"]
where $x//span/normalize-space() = "data1"
return $xhttps://stackoverflow.com/questions/42470544
复制相似问题