Как использовать регулярное выражение в XSLT 1.0?
Я использую XSLT 1.0.
Моя входная информация может содержать эти значения
<!--case 1-->
<attribute>123-00</attribute>
<!--case 2-->
<attribute>Abc-01</attribute>
<!--case 3-->
<attribute>--</attribute>
<!--case 4-->
<attribute>Z2-p01</attribute>
Я хочу узнать те строки, которые соответствуют критериям:
if string has at least 1 alphabet AND has at least 1 number,
then
do X processing
else
do Y processing
В приведенном выше примере, для случая 1,2,4 я должен иметь возможность выполнять обработку X
. Для случая 3 я должен выполнить обработку Y
.
Я хочу использовать регулярное выражение (в XSLT 1.0).
Для всех случаев атрибут может принимать любое значение любой длины.
Я попытался использовать match
, но процессор возвратил ошибку.
Я попытался использовать функцию translate
, но не уверен, правильно ли используется.
Я думаю.
if String matches [a-zA-Z0-9]*
then do X processing
else
do y processing.
Как реализовать это с помощью синтаксиса XSLT 1.0?
Ответы
Ответ 1
Это решение действительно работает в XSLT 1.0 (и проще, потому что ему не нужен и не нужно использовать метод double-translate.):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:variable name="vUpper" select=
"'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:variable name="vLower" select=
"'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:variable name="vAlpha" select="concat($vUpper, $vLower)"/>
<xsl:variable name="vDigits" select=
"'0123456789'"/>
<xsl:template match="attribute">
<xsl:choose>
<xsl:when test=
"string-length() != string-length(translate(.,$vAlpha,''))
and
string-length() != string-length(translate(.,$vDigits,''))">
Processing X
</xsl:when>
<xsl:otherwise>
Processing Y
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному фрагменту XML - сделал хорошо сформированный XML-документ:
<t>
<!--case 1-->
<attribute>123-00</attribute>
<!--case 2-->
<attribute>Abc-01</attribute>
<!--case 3-->
<attribute>--</attribute>
<!--case 4-->
<attribute>Z2-p01</attribute>
</t>
требуется, правильный результат получается:
Processing Y
Processing X
Processing Y
Processing X
Делать заметку. Любая попытка использовать с истинным кодом процессора XSLT 1.0, подобным этому (заимствованный из другого ответа на этот вопрос), будет с ошибкой:
<xsl:template match=
"attribute[
translate(.,
translate(.,
concat($upper, $lower),
''),
'')
and
translate(., translate(., $digit, ''), '')]
">
потому что в XSLT 1.0 запрещено, чтобы шаблон соответствия содержал ссылку на переменную.
Ответ 2
XSLT не поддерживает регулярные выражения, но вы можете подделать его.
Следующая таблица стилей печатает сообщение X processing
для всех элементов attribute
, имеющих строковое значение, содержащее хотя бы одно число и по крайней мере одну букву (и Y processing
для тех, которые этого не делают):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="lower" select="'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:variable name="upper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:variable name="digit" select="'0123456789'"/>
<xsl:template match="attribute">
<xsl:choose>
<xsl:when test="
translate(., translate(., concat($upper, $lower), ''), '') and
translate(., translate(., $digit, ''), '')">
<xsl:message>X processing</xsl:message>
</xsl:when>
<xsl:otherwise>
<xsl:message>Y processing</xsl:message>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Примечание: Вы сказали следующее:
В приведенном выше примере, для случая 1,2,4 я должен иметь возможность обрабатывать X. для случая 3 я должен уметь обрабатывать Y.
Но это противоречит вашему требованию, потому что случай 1 не содержит буквы. Если, с другой стороны, вы действительно хотите сопоставить эквивалент [a-zA-Z0-9]
, то используйте это:
translate(., translate(., concat($upper, $lower, $digit), ''), '')
..., который соответствует любому attribute
, имеющему хотя бы одну букву или номер.
Для получения дополнительной информации об использовании translate
см. следующий вопрос:
Ответ 3
Если вы нашли этот вопрос, потому что ищете способ использования регулярных выражений в XSLT 1.0 и пишете приложение с использованием Microsoft XSLT-процессора, вы можете решить эту проблему, используя встроенный С# W370 > .
Я выписал пример и несколько советов в этом потоке, где кто-то искал аналогичную функциональность. Это очень просто, хотя это может быть или не быть подходящим для ваших целей.