FLWOR XQuery в C# возвращает пустой?
Я пытаюсь использовать Xquery FLOWR, где заявление в C#:
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, он ведет себя как ожидалось. Я что-то пропустил?
1 ответ
Причиной этого является BaseX CHOP
опция, которая обрезает все пробелы на концах текстовых узлов. При импорте в 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