以字符串形式检测网址或电子邮件

时间:2017-12-09 20:28:13

标签: xslt xpath xpath-1.0

我试图检测xml文件的字符串元素中的url或email是否正在应用此xslt。这是我使用的代码的一部分:

<xsl:template match="/contacts/contact/other-contact">
    <xsl:value-of select="service"/>
    <xsl:choose>
            <xsl:when test="@type != ''">
                <xsl:text>(</xsl:text>
                <xsl:value-of select="@type"/>
                <xsl:text>)</xsl:text>
            </xsl:when>
        </xsl:choose>
    <xsl:text>: </xsl:text>
    <xsl:choose>
        <xsl:when test="matches(address,'(http(s?)://)?((www\.)?)(\w+\.)+.+')">
            <a href="{address}"><xsl:value-of select="address"/></a>
        </xsl:when>
        <xsl:when test="matches(address,'[^@]+@[^\.]+\.\w+')">
            <a href="mailto:{address}"><xsl:value-of select="address"/></a>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="address"/>
        </xsl:otherwise>
    </xsl:choose>
    <br/>
</xsl:template>

根据this answermatches(var,regex)应该可行,但它给了我这个错误:

xmlXPathCompOpEval: function matches not found
XPath error : Unregistered function
xmlXPathCompiledEval: 2 objects left on the stack.

address/contacts/contact/other-contact

的元素

1 个答案:

答案 0 :(得分:1)

fn:matches 函数确定字符串是否与正则表达式语法匹配是由XML Schema定义的,并在XQueryXPath / XSLT 2.0中进行了一些修改/添加。

可能您正在使用XSLT 1.0,安全性将是使用包含功能,并且更加清晰,如下例所示:

<xsl:template match="/contacts/contact/other-contact">  
    <!--check if type is not blank, otherwise it will pass blank-->    
    <xsl:variable name="var.type">            
        <xsl:if test="string-length(@type) &gt;0">                
            <xsl:value-of select="concat('(', @type, ')')"/>            
        </xsl:if>        
    </xsl:variable>
    <!--check address--> 
    <xsl:variable name="var.address">    
        <xsl:choose>        
            <xsl:when test="contains(address,'http') or contains(address,'www')">            
                <a href="{address}"><xsl:value-of select="address"/></a>  
            </xsl:when>        
            <xsl:when test="contains(address,'@')">            
                <a href="mailto:{address}"><xsl:value-of select="address"/></a>
            </xsl:when>        
            <xsl:otherwise>
              <xsl:value-of select="address"/>       
            </xsl:otherwise>   
        </xsl:choose>        
    </xsl:variable>      
    <!--safe concat all your result-->    
    <xsl:value-of select="concat(service, $var.type, ': ', $var.address)"/>

</xsl:template>