Вот правильный способ сопоставления XSLT 1.0 (в XSLT 2.0 используйте функцию match () с реальным RegEx в качестве аргумента pattern
):
Соответствует элементу, имя которого содержит 'line'
:
<xsl:template match="*[contains(name(), 'line')]">
<!-- Whatever processing is necessary -->
</xsl:template>
Соответствует элементу, имя которого заканчивается на 'line'
:
<xsl:template match="*[substring(name(), string-length() -3) = 'line']">
<!-- Whatever processing is necessary -->
</xsl:template>
@ Tomalak предоставил еще один способ XSLT 1.0 для поиска имен, заканчивающихся данной строкой. Его решение использует специальный символ, который гарантированно не будет присутствовать ни в одном имени. Мое решение может быть применено, чтобы найти, если любая строка (не только имя элемента) заканчивается другой данной строкой.
В XSLT 2.x :
Используйте : matches(name(), '.*line$')
для сопоставления имен, заканчивающихся строкой "line"
Это преобразование :
при применении к этому XML-документу :
<greeting>
<aaa>Hello</aaa>
<bblineb>Good</bblineb>
<ccc>Excellent</ccc>
<dddline>Line</dddline>
</greeting>
Копирует на выход только элемент, имя которого заканчивается строкой "line"
:
<dddline>Line</dddline>
При этом преобразовании (использует matches(name(), '.*line')
):
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="*[matches(name(), '.*line')]">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="*[not(matches(name(), '.*line'))]">
<xsl:apply-templates select="node()[not(self::text())]"/>
</xsl:template>
</xsl:stylesheet>
копирует на выход все элементы, имена которых содержат строку "line"
:
<bblineb>Good</bblineb>
<dddline>Line</dddline>