Проверка только символов в строке xsl?

Как я могу проверить, содержит ли строка только символы (XSLT-файл)?

<xsl:variable name="IsValid1">
  <xsl:choose>
    <xsl:when test="string-length(//FirstName) &gt; 0 and string-length(//LastName) &gt; 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>
Другие вопросы по тегам