XPath 1.0, чтобы найти, если значение элемента находится в списке значений - PullRequest
27 голосов
/ 12 июня 2010

Есть ли способ создать XPath, который оценивает, находится ли значение элемента в предопределенном списке значений?Что-то похожее на это:

/Location/Addr[State='TX or AL or MA']

Что будет соответствовать узлам с элементами штата для Техаса, Алабамы или Массачусетса?Я знаю, что могу распаковать выражение:

/Location/Addr[State='TX] or  /Location/Addr[State='AL'], etc...

Но это немного громоздко, поскольку xpaths довольно длинные, как и список значений.Мой гугл-фу не особо заинтересован в этом вопросе ...

Ответы [ 2 ]

48 голосов
/ 12 июня 2010

Вы можете проверить несколько условий в одинаковых квадратных скобках:

/Location/Addr[State='TX' or State='AL' or State='MA']

Или, если у вас очень длинный список, вы можете создать список состояний и использовать функцию contains().

/Location/Addr[contains('TX AL MA', State)]

Это будет хорошо работать для двухбуквенных государственных сокращений. Если вы хотите сделать его более надежным для более длинных строк, вы можете добавить несколько пробелов на концах и проверить наличие _TX_, _AL_ и т. Д. (Где подчеркивания - пробелы).

/Location/Addr[contains(' TX AL MA ', concat(' ', State, ' '))]
6 голосов
/ 07 июля 2017

Просто некромантия, так как появился XPath 2.0.

С XPath 2.0 вы можете сделать:

/Location/Addr[State=('TX', 'AL', 'MA')]

В качестве альтернативы, с XPath 1.0 вы можете использовать содержит в сочетании с длиной строки:

declare @tXML xml = '<svg>
<g>
<path></path>
<path data-objid="0000X1"></path>
<path data-objid="0000X2"></path>
<path data-objid="0000X3"></path>
</g>
</svg>';

-- select @tXML;

SELECT 
    c.p.value('(@data-objid)[1]', 'varchar(50)') AS 'DocumentID'
FROM @tXML.nodes('//node()[contains("0000X1,0000X2", @data-objid) and string-length(@data-objid) != 0]') AS c(p)


set @tXML.modify('delete //node()[contains("0000X1,0000X2", @data-objid) and string-length(@data-objid) != 0]'); 

select @tXML;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...