Mysql like子句与XPath等效

时间:2012-05-11 19:54:52

标签: php mysql xml xslt xpath

我需要等效的以下sql查询:

选择所有标题以“V”开头,后跟3个字符,然后是空格后跟字符串的电影(例如Van Helsing)

SELECT * FROM films WHERE title LIKE ="V__ %";

我怎样才能在像film / film / title,xpath 1.0这样的树中执行xpath 1.0表达式,因为我将使用php和xslt。

谢谢

2 个答案:

答案 0 :(得分:2)

是否可以,如果无法呈现空格后的字符串?然后你可以使用:

//title[starts-with(text(), 'V') and string-length(substring-before(text(), ' '))=3]

如果空格后存在字符串很重要,那么您可以使用:

//title[starts-with(text(), 'V') and string-length(substring-before(text(), ' '))=3 and string-length(substring-after(text(), ' '))>0]

来自http://www.w3.org/TR/xpath/

答案 1 :(得分:1)

请注意,当前接受的答案错误地选择了不匹配的选择标准元素 - 请参阅此答案的结尾。

这是一个正确的解决方案

使用

/films/film/title
    [starts-with(., 'V')
   and
     not(translate(substring(.,1,3), $vAlpha, ''))      
   and
     substring(.,4,1) = ' '     
   and
     not(substring(.,5,1) = ' ')
   and
     not(translate(., concat($vAlpha, ' '), ' '))       
    ]

其中$vAlpha是完全由所有字母组成的字符串。

这会选择字符串值

的所有元素/films/film/title
  1. 以字符V开头。

  2. 它的三个字母都是字母。

  3. 它的第四个角色是一个空间。

  4. 它的第五个字符不是空格。

  5. 它的所有字符都是字母或空格。

  6. 基于XSLT的验证

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>
     <xsl:variable name="vAlpha" select=
      "concat('ABCDEFGHIJKLMNOPQRSTUVWXYZ',
              'abcdefghijklmnopqrstuvwxyz')"/>
    
     <xsl:template match="/">
         <xsl:copy-of select=
          "/films/film/title
                [starts-with(., 'V')
           and
                 not(translate(substring(.,1,3), $vAlpha, ''))      
           and
                 substring(.,4,1) = ' '     
               and
                not(substring(.,5,1) = ' ')
               and
                not(translate(., concat($vAlpha, ' '), ' '))        
                ]
          "/>
     </xsl:template>
    </xsl:stylesheet>
    

    将此转换应用于以下XML文档时:

    <films>
     <film>
      <title>Van Helsing</title>
     </film>
     <film>
      <title>Van  Helsing</title>
     </film>
     <film>
      <title>Ban Helsing</title>
     </film>
     <film>
      <title>van Helsing</title>
     </film>
     <film>
      <title>Vann Helsing</title>
     </film>
     <film>
      <title>Van Helsing2</title>
     </film>
    </films>
    

    评估上述XPath表达式,并将所选元素(本例中只有一个)复制到输出

    <title>Van Helsing</title>
    

    请注意,当前接受的答案错误地选择了以下两个不匹配的元素:

    <title>Van  Helsing</title>
    <title>Van Helsing2</title>