Как вы делаете подстановочные совпадения с XSLT? - PullRequest
9 голосов
/ 15 октября 2010

Если у меня есть такой исходный файл:

<animal name="fred_monkey" />
<animal name="jim_banana" />
<animal name="joe_monkey" />

Могу ли я создать в моей таблице стилей выражение XPATH, которое выбирает только животных со строкой «_monkey» в их имени?

например, подстановочный знак '* _monkey'?

1 Ответ

28 голосов
/ 15 октября 2010

Могу ли я сделать выражение XPATH в своей таблице стилей, которое выбирает только животных со строкой '_monkey' в их имени?

например, подстановочный знак '* _monkey'?

Этот подстановочный знак означает строку, заканчивающуюся"_monkey", а не строку, содержащую"_monkey".

Использование :

//animal[ends-with(@name, '_monkey')]

Выше используется стандартная функция XPath 2.0 ends-with() и, таким образом, она доступна только в XSLT 2.0.

В XSLT1.0 используйте следующее выражение XPath 1.0 :

//animal[substring(@name, string-length(@name) -6)='_monkey']

Не рекомендуется использовать сокращение //, так как это может привести к неэффективной оценке .Используйте более конкретную цепочку тестов местоположения всякий раз, когда известна структура XML-документа.Например, если все элементы animal являются дочерними элементами верхнего элемента документа XML, то следующие выражения XPath (2.0 или 1.0 соответственно) могут быть более эффективными:

/*/animal[ends-with(@name, '_monkey')]

и

/*/animal[substring(@name, string-length(@name) -6)='_monkey']

В зависимости от конкретных потребностей (например, вы действительно имели в виду «содержит», а не «заканчивается»), функции contains(), starts-with() и substring() также могут быть полезны:

contains(someString, someTargetString)

starts-with(someString, someTargetString)

substring(someString, start-index, length) = someTargetString

Наконец, matchатрибут <xsl:templates> не должен содержать абсолютное выражение XPath - рекомендуется использовать только относительное выражение XPath, которое задает достаточно контекста.

Таким образом, вышеприведенное, используемое в качестве выражений совпадения, будетбыть чем-то вроде:

<xsl:template match="animal[ends-with(@name, '_monkey')]">

и

<xsl:template match=
  "animal[substring(@name, string-length(@name) -6)='_monkey']">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...