我需要等效的以下sql查询:
选择所有标题以“V”开头,后跟3个字符,然后是空格后跟字符串的电影(例如Van Helsing)
SELECT * FROM films WHERE title LIKE ="V__ %";
我怎样才能在像film / film / title,xpath 1.0这样的树中执行xpath 1.0表达式,因为我将使用php和xslt。
谢谢
答案 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]
答案 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
以字符V
开头。
它的三个字母都是字母。
它的第四个角色是一个空间。
它的第五个字符不是空格。
它的所有字符都是字母或空格。
基于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>