1

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

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

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

我如何在电影/电影/标题、xpath 1.0 等树中执行 xpath 1.0 表达式,因为我将使用 php 和 xslt。

谢谢

4

2 回答 2

2

Is it ok, if string after space can not be presented? Then you can use:

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

If presence of string after space is important, then you can use:

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

From http://www.w3.org/TR/xpath/

于 2012-05-11T20:47:34.300 回答
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 个字符不是空格。

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

基于 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>
于 2012-05-12T02:23:45.373 回答