Сравнение подэлементов / дочерних атрибутов текущего элемента с подэлементами / дочерними атрибутами следующего элемента - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь написать правило схематора для сравнения атрибута текущего подэлемента (End @value) в цикле со следующим атрибутом подэлементов (Origin @value). Я не уверен, правильно ли я поступаю, вот моя попытка

Вот моя попытка:

<sch:rule context="test">
    <sch:assert test="End/@value = following-sibling::test/Origin/@value " >Both the value are not Equal. </sch:assert>
</sch:rule>

Это правило работает нормально до последнего элемента, последний элемент ожидает другого элемента, которого нет. проблема может быть связана с «последующим братом».

Вот XML-файл:

<tests>
<test x="-276.724" xEnd="-276.193">
    <Origin value="36.599"/>
    <End value="36.6"/>
</test>
<test x="-276.193" xEnd="-260.29">
    <Origin value="36.6"/>
    <End value="36.603"/>
</test>
<test x="-260.29" xEnd="-240.194">
    <Origin value="36.603"/>
    <End value="36.601"/>
</test>
<test x="-240.194" xEnd="-220.046">
    <Origin value="36.601"/>
    <End value="36.601"/>
</test>
<test x="-220.046" xEnd="-200.09">
    <Origin value="36.601"/>
    <End value="36.602"/>
</test>

Ожидаемый результат: Поскольку текущий подэлемент (End @value) = следующий атрибут подэлементов (Origin @value), результат должен быть успешным.

Фактический результат.

    <test x="-220.046" xEnd="-200.09">
    <Origin value="36.601"/>
    <End value="36.602"/>
</test>

для этого элемента я получаю сбой при задании

1 Ответ

0 голосов
/ 26 марта 2019

Я предполагаю, что вы используете привязку XSLT 2.0.

Если это так, End/@value = following-sibling::test/Origin/@value сравнивает атрибут value дочернего элемента End с атрибутом value дочернего элемента Origin для каждого следующего элемента test. , Это оценивается как истина, если любой из значений Origin/@value совпадает. Это, вероятно, не то, что вы хотите.

Оба элемента End и Origin являются потомками элемента test, который является контекстом для ваших выражений XPath. Если вы хотите проверить два дочерних элемента:

<sch:rule context="test">
  <sch:assert test="End/@value = Origin/@value"
  >Both the  value are not Equal. </sch:assert>
</sch:rule>

Если вы хотите проверить End/@value из текущего элемента test с Origin/@value из следующего элемента test, но не завершиться ошибкой, если нет следующего элемента test:

<sch:rule context="test[exists(following-sibling::test[1])]">
  <sch:assert test="End/@value = following-sibling::test[1]/Origin/@value"
  >Both the  value are not Equal. </sch:assert>
</sch:rule>

[1] ограничивает XPath выбором только первого test.

...