有没有办法检查文本字符串是否包含预定数组中的任何条目?用例是我正在解析大量文本并查找文本链接。因此,我正在擦洗每个单词,并对每个单词进行检查,寻找流行的顶级域名,看看它们是否是链接。这是一些破碎的代码但是给你一个想法:
XML:
<feed>
<description>You can come here to yourwebsite.org to learn more</description>
</feed>
XSL:
<xsl:variable name="tlds" select="'.com .net .org .edu .gov .ly'" />
*** There is a bunch of XSL here that chopps up description into individual words to check ***
<xsl:if test="contains($current_word, $tlds)">
The current word being checked contained an item in the array!
</xsl:if>
除了检查顶级域名外,一切正常。所以我不需要任何循环或任何东西,只是如何对$ tlds数组进行检查。
答案 0 :(得分:2)
目前,您的 $ tlds 变量不是数组,而是一个简单的字符串。你可以做的是设置这样的变量,使其更像一个数组
<xsl:variable name="tlds">
<tld>.com</tld>
<tld>.net</tld>
<tld>.org</tld>
<tld>.edu</tld>
<tld>.ly</tld>
</xsl:variable>
然后定义另一个变量以在XSLT样式表中引用此变量
<xsl:variable name="lookup" select="document('')//xsl:variable[@name='tlds']"/>
然后,要查看 $ tlds 变量中是否存在单词,请执行以下操作:
<xsl:if test="$lookup/tld=$word">
The current word being checked contained an item in the array!
</xsl:test>
编辑:或者,如果你想检查一个单词是否包含数组中的一个项目,你会这样做:
<xsl:if test="$lookup/tld[contains($word, .)]">
The current word being checked contained an item in the array!
</xsl:test>
例如,这里有一些XSLT可以完全显示这个
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:variable name="tlds">
<tld>.com</tld>
<tld>.net</tld>
<tld>.org</tld>
<tld>.edu</tld>
<tld>.ly</tld>
</xsl:variable>
<xsl:variable name="lookup" select="document('')//xsl:variable[@name='tlds']"/>
<xsl:template match="description">
<xsl:call-template name="checkword">
<xsl:with-param name="word">www.pie.com</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="checkword">
<xsl:with-param name="word">www.pie.co.uk</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name="checkword">
<xsl:param name="word"/>
<xsl:choose>
<xsl:when test="$lookup/tld[contains($word, .)]">
<xsl:value-of select="$word" /> is contained an item in the array!
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$word" /> is not in the array
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
这应该输出以下内容:
www.pie.com is contained an item in the array!
www.pie.co.uk is not in the array
答案 1 :(得分:2)
如果你的变量$ tlds必须是一个“数组”(空格分隔的标识符列表),这是一个解决方案。 这个想法是用递归模板调用将这个列表拆分成单词。 (可能正如您已对输入文本所做的那样。)
<xsl:template name="checkword">
<xsl:param name="current_word"/>
<xsl:variable name="contain_tld">
<xsl:call-template name="check_tlds">
<xsl:with-param name="current_word" select="$current_word"/>
<xsl:with-param name="l_tlds" select="$tlds"/>
<xsl:with-param name="cnt_tlds" select="0"/>
</xsl:call-template>
</xsl:variable>
<xsl:if test="$contain_tld > 0">
The current word being checked contained an item in the array!
</xsl:if>
</xsl:template>
<xsl:template name="check_tlds">
<xsl:param name="current_word"/>
<xsl:param name="l_tlds"/>
<xsl:param name="cnt_tlds"/>
<xsl:choose>
<xsl:when test="contains($l_tlds,' ')">
<xsl:variable name="result">
<xsl:call-template name="check_tlds">
<xsl:with-param name="current_word" select="$current_word"/>
<xsl:with-param name="l_tlds" select="substring-before($l_tlds,' ')"/>
<xsl:with-param name="cnt_tlds" select="0"/>
</xsl:call-template>
</xsl:variable>
<xsl:call-template name="check_tlds">
<xsl:with-param name="current_word" select="$current_word"/>
<xsl:with-param name="l_tlds" select="substring-after($l_tlds,' ')"/>
<xsl:with-param name="cnt_tlds" select="$cnt_tlds+ $result"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="contains( $current_word, $l_tlds)">
<xsl:value-of select="$cnt_tlds + 1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$cnt_tlds"/>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
这只能表明这个想法。肯定会有一些改进。