Могу ли я сделать выражение 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']">