Проверка только символов в строке xsl?
Как я могу проверить, содержит ли строка только символы (XSLT-файл)?
<xsl:variable name="IsValid1">
<xsl:choose>
<xsl:when test="string-length(//FirstName) > 0 and string-length(//LastName) > 0 and substring(//FirstName, 1, 3) != 'TST' and XXXX//FirtName only charactersXXXXX ">
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
3 ответа
В XPath 1.0 (XSLT 1.0) вы можете использовать contains()
, В XPath 2.0 (XSLT 2.0) вы используете matches()
,
Например, вы можете проверить только алфавитные символы (без цифр, без других знаков, без пробелов):
matches(//FirstName, '^[a-zA-Z]+$')
или буквенно-цифровой,
matches(//FirstName, '^[a-zA-Z0-9]+$')
Это выражение XPath:
string-length(translate($yourString, $allValidChars, '')) = 0
оценивает true()
именно тогда, когда все символы в $yourString
содержатся в строке $allValidChars
,
В противном случае это оценивает false()
,
II. Решение XPath 2.0 - еще более мощное
Всякий раз, когда ни "действительные" символы, ни "недопустимые символы" не имеют удобного и компактного выражения, можно использовать возможности RegEx в XPath 2.0. Используя RegEx и классы символов, можно написать это:
matches($str,'^\p{L}+$')
это соответствует $str
только когда он полностью состоит из букв (все символы Unicode, которые являются буквами в любом алфавите, поддерживаемом Unicode).
Вот небольшая проверка на основе XSLT 2.0:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="s[matches(.,'^\p{L}+$')]">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
когда это преобразование применяется к следующему документу XML:
<t>
<s>abcDПЖЗ</s>
<s>abcd</s>
<s>abcd123</s>
</t>
желаемый правильный результат получается:
<s>abcDПЖЗ</s>
<s>abcd</s>
Пояснение:
Согласно спецификации, \p{L}
соответствует любому письму.
Связанные с этой проблемой:
В XPath 1.0 как бы вы удалили все не-буквенные символы из строки?
Здесь сложность в том, что вы не знаете, что это за персонажи, не являющиеся афа.
Решение также известно как "метод двойного перевода", впервые показанный Майклом Кейем (@Michael Kay):
translate($s, translate($s, $alpha, ''), '')
В XPath 1.0 я предлагаю использовать этот метод, чтобы разрешить только буквы в FirstName
Обновлено:
<xsl:variable name="not-allowed-characters">0123456789</xsl:variable>
<xsl:choose>
<xsl:when test="string-length(translate(//FirstName, $not-allowed-characters, '')) = string-length(//FirstName)">
<xsl:value-of select="true()"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="false()"/>
</xsl:otherwise>
</xsl:choose>
Чтобы расширить это, просто добавьте недопустимые символы внутри not-allowed-characters
переменная.
Старая версия:
<xsl:variable name="not-allowed-characters">0123456789</xsl:variable>
<xsl:variable name="mock">$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$</xsl:variable>
<xsl:variable name="replacement">
<xsl:value-of select="substring($mock, 1, string-length($not-allowed-characters))"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="not(contains(translate(//FirstName, $not-allowed-characters, $replacement), '$'))">
<xsl:value-of select="true()"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="false()"/>
</xsl:otherwise>
</xsl:choose>