0

有没有办法检查文本字符串是否包含预定数组中的任何条目?用例是我正在解析大量文本并寻找文本链接。因此,我正在浏览每个单词并检查每个单词以寻找流行的顶级域,看看它们是否是一个链接。这是一些损坏的代码,但给了您一个想法:

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 数组。

4

2 回答 2

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
于 2013-04-10T22:33:43.957 回答
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 &gt; 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>

这只应该表明这个想法。当然有一些改进可能。

于 2013-04-11T16:04:45.520 回答