1

我正在尝试在 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 语句,它将按预期运行。我错过了什么吗?

4

1 回答 1

1

造成这种情况的原因是 BaseX 的CHOPoption,它会修剪文本节点末尾的所有空白。当导入 BaseX 并CHOP启用(这是默认设置)时,您的文档如下所示:

<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 $x
于 2017-02-26T17:18:29.587 回答