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
Другие вопросы по тегам