在if-test中检查数组的文本字符串

时间:2013-04-10 15:02:41

标签: xml arrays xslt if-statement xslt-1.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数组进行检查。

2 个答案:

答案 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 &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>

这只能表明这个想法。肯定会有一些改进。