Scala, объединение фильтров на узле XML

Пример XML:

<structure-node (n)>
    <node-data (1)>
        <feature-list (n)>
            <feature (n)>
                <value (1)>123</value>
            </feature>
        </feature-list>
    </node-data>
</structure-node>

В скобках максимальное количество вхождений. Я хочу получить структуру-узел, но только там, где содержащее значение равно 123.

Я пробовал это (Play! with Scala):

@{ (parentNode \ "structure-node").filter{ f => (f \ "node-data" \ "feature-list" \ "feature" \ "value").text == "123"}  }

Но похоже, что я не могу фильтровать поля, которых нет на самом узле. Нужно ли комбинировать фильтры? Я пробовал, но не получилось...

Есть идеи?


person GarfieldKlon    schedule 10.08.2012    source источник


Ответы (1)


вы можете использовать функцию exists, чтобы добавить условие в SeqNode тегов "value" под тегом "structure-node":

(parentNode \ "structure-node").filter(s => (s \ "node-data" \ "feature-list" \ "feature" \ "value").exists ( t => t.text == "123"))

or

(parentNode \ "structure-node").filter(s => (s \\ "value").exists ( t => t.text == "123"))
person fp4me    schedule 10.08.2012
comment
Кажется, это работает только в том случае, если есть только один список функций и только одна функция в нем. Я думаю, что мне нужно фильтровать, фильтровать и снова фильтровать... - person GarfieldKlon; 13.08.2012
comment
Вы можете управлять многими событиями с помощью селектора \\, я отредактировал свой ответ, чтобы исправить это - person fp4me; 13.08.2012
comment
Я знаю это из XSLT и уже пробовал, но безуспешно. Вы проверили это? Мое решение: @{(parentNode \ "structure-node").filter( fo => fo.exists {fi => (fi \ "node-data" \\ "feature-list" \\ "feature" \ "value").text == "123" } ) } не работает. - person GarfieldKlon; 13.08.2012
comment
Я понимаю, почему это не работает, потому что, если у вас есть много случаев, когда тексты функций или списков функций объединены, я проверю это и вернусь к вам. - person fp4me; 13.08.2012
comment
Хорошо, это именно то, что я имел в виду. У вас есть только один список функций и одна функция в нем. Но в ‹node-data› может быть n ‹feature-list› и в этом n ‹feature›. А то вроде не работает. - person GarfieldKlon; 13.08.2012
comment
Я отредактировал сообщение с правильной фильтрацией;) теперь я работаю над SeqNode значений - person fp4me; 13.08.2012
comment
Это работает, большое спасибо. Все дело в правильном использовании \\ - person GarfieldKlon; 13.08.2012
comment
я сделал ошибку относительно \\, потому что он нам здесь не нужен, \\ будет необходим, если вы не укажете промежуточные узлы между parentNode и значением Node, я обновил ответ с различными возможностями - person fp4me; 13.08.2012