c# returns 中的 FLWOR XQuery 为空?

FLWOR XQuery in c# returns empty?

我正在尝试在 C# 中使用 Xquery FLOWR where 语句:

for $x in //div[@class="class1"] where $x//span="data1" return $x  

从 xml 文件中获取一些数据。 (使用 FLOWR 的原因是为了方便地从外部文件读取查询运行时)

为此我使用撒克逊 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 测试此代码,它会像我预期的那样工作并且 return 是两个 class1 类 之一;然而,Saxon 和 xpathtester.com 编译 Xquery 时没有错误,但 return 为空。 如果我删除可选的 where 语句,它会按预期运行。我错过了什么吗?

原因是 BaseX 的 CHOP option,它 trim 文本节点末尾的所有空格。在启用 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 子句与切碎文档的文本内容匹配,但与原始文档不匹配。

您可以 trim 查询中的空格代替,这在所有情况下都有效:

for $x in //div[@class = "class1"]
where $x//span/normalize-space() = "data1"
return $x