Есть ли способ найти узел, совпадающий по части значения.
Если у меня есть следующее:
<competition id = "100" name = "Barclays Premier League"/>
<competition id = "101" name = "CocaCola Championship" />
<competition id = "102" name = "CocaCola League 1" />
Учитывая строку «Премьер-лига» или даже «Премьер-лига», как мне сопоставить правильный узел и получить идентификатор 100.
Я справился с этим с помощью for-each и contains, но это очень неэффективно и работает недостаточно быстро для наших требований.





Обработка строк - это не то, в чем XSLT хорош, но есть несколько вариантов.
В этом случае вы можете попробовать:
//competition[contains(@name,'Prem')]
см. здесь для получения дополнительных опций и деталей
"//", вероятно, тоже нецелесообразно, прежде чем кто-либо еще упомянет об этом - я просто не знал никакой другой структуры для пути, очевидно.
Аннаката, я думаю, вы немного ошибаетесь насчет возможностей XSLT по обработке строк. Загляните в мой блог, где вы найдете несколько интересных примеров обратного. :) Ваше здоровье
@Dimitre - я делаю это утверждение в отношении действительно надежных языков со строковыми функциями, таких как perl и JS, и с учетом неуклюжести таких задач, как string.replace. Я люблю XSLT так же сильно, как и следующий фанат XSLT :)
@Annacata, приятно, что вы поклонник XSLT :) Но на самом деле я сделал проверку орфографии, построение согласованности, решил Wide Finder Тима Брея всего в 22 строках, предоставил общий парсер LR, использовал его для синтаксического анализа JSON и XPath 2 ... все это в чистом XSLT. Какие еще задачи по обработке строк нам нужны?
@dimitre - впечатлил проверкой орфографии. Я бы предположил, что то, что что-то возможно, не означает, что это эффективно. Вы не можете сказать, что поиск и замена в XSLT элегантны. Мне было бы интересно посмотреть, как ваш чистый XSLT-подход сравнивает тесты (например) с аргументами расширения .net xslt.
@Annacata, это не язык, а используемый алгоритм. Я предполагаю, что стандартная функция XPath 2.0 replace (), которая использует RegEx-s, не будет сильно отличаться по эффективности от функции расширения .NET. Конечно, в .NET придется использовать (пока) не-MS продукт, такой как Saxon.NET.
Также существует функция «сопоставления», в которой используются регулярные выражения, но она доступна только в XSL 2.0.
И если вам нужен только идентификатор, то // соревнование [содержит (@name, "Prem")] / @ id