XPath / XSLT 1.0 не поддерживает регулярные выражения, но простая проверка может быть выполнена с использованием основных строковых функций.
Белый список
XPath 1.0 translate
Функция может использоваться для имитации белого списка:
<xsl:variable name="alpha"
select="'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:if test="string-length(translate(., $alpha, '')) > 0">
<!-- context node contains non-alpha characters -->
</xsl:if>
В тесте используется translate
, чтобы сначала удалить все буквы в верхнем и нижнем регистре.Если длина результирующей строки не равна нулю, тогда исходная строка должна содержать дополнительные символы.
Обратите внимание, что приведенное выше выражение можно упростить до:
<xsl:if test="translate(., $alpha, '')">
... потому что любоенепустая строка оценивается как true.
Черный список
Используйте метод двойного перевода для обработки $alpha
как черного списка:
<xsl:if test="translate(., translate(., $alpha, ''), '')">
<!-- context-node contains characters on the blacklist (in $alpha) -->
</xsl:if>
Внутренний translate
возвращает строку со всеми удаленными альфа-символами, которая затем используется в качестве шаблона для второго вызова translate
, в результате чего получается строка, содержащая только альфа-символы.Если эта строка ненулевая, то мы нашли символ в черном списке.Это классический подход.См., Например, этот предыдущий вопрос по SO:
Тест черного списка также может быть выполнен следующим образом:
not(string-length(translate(., $alpha, ''))=string-length())
Если длина строки после удаления всех символов из черного списка не равна длине исходной строки, то строка должна содержать символ в черном списке.
Резюме
Черные и белые списки - это две стороны одной медали.Следующее демонстрирует их использование вместе:
<xsl:if test="translate(., $alpha, '')">
[contains some characters not on the list]
</xsl:if>
<xsl:if test="not(translate(., $alpha, ''))">
[contains only characters on the list]
</xsl:if>
<xsl:if test="translate(., translate(., $alpha, ''), '')">
[contains some characters on the list]
</xsl:if>
<xsl:if test="not(translate(., translate(., $alpha, ''), ''))">
[contains only characters not on the list]
</xsl:if>