Функция contains
не принимает регулярное выражение в качестве второго аргумента, просто простая строка, которую она проверяет, находится в первой строке или нет.Вы должны использовать matches
...
<xsl:for-each select="datafield[matches(@tag, '^150$|^151$')]">
Или чуть лучше ...
<xsl:for-each select="datafield[matches(@tag, '^(150|151)$')]">
Обратите внимание на дополнительные символы, чтобы предотвратить совпадение, например, с "1500".
Однако matches
- это только XSLT 2.0, а использование <?xml-stylesheet
предполагает, что вы выполняете преобразование в браузере, которое на самом деле будет только XSLT 1.0.Если это так, тогда вы можете использовать contains
с небольшим дополнительным усилием
<xsl:for-each select="datafield[contains('|150|151|', concat('|', @tag, '|') )]">
Опять же, дополнительное использование |
заключается в том, чтобы предотвратить, например, 1500
.