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
таким образом: