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
我正在尝试在 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