正则表达式 – 如何在XSLT 1.0中使用正则表达式?

前端之家收集整理的这篇文章主要介绍了正则表达式 – 如何在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中).

对于所有的情况,属性可以取任何长度的任何值.

我尝试使用匹配,但处理器返回错误.
我尝试使用翻译功能,但不确定如果使用正确的方式.

我在想

if String matches [a-zA-Z0-9]* 
then do X processing
else
do y processing.

如何使用XSLT 1.0语法实现?

这个解决方案真的适用于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(.,$digit,'')]
 ">

因为在XSLT 1.0中,禁止匹配模式包含变量引用.

猜你在找的正则表达式相关文章