我试图检测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 answer,matches(var,regex)
应该可行,但它给了我这个错误:
xmlXPathCompOpEval: function matches not found
XPath error : Unregistered function
xmlXPathCompiledEval: 2 objects left on the stack.
address
是/contacts/contact/other-contact
答案 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) >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>