我需要等效于以下 sql 查询:
选择标题以“V”开头的所有电影,后跟 3 个字符,然后是一个空格,后跟一个字符串(例如 Van Helsing)
SELECT * FROM films WHERE title LIKE ="V__ %";
我如何在电影/电影/标题、xpath 1.0 等树中执行 xpath 1.0 表达式,因为我将使用 php 和 xslt。
谢谢
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]
请注意,当前接受的答案错误地选择了不匹配的选择标准元素 - 请参阅此答案的结尾。
这是一个正确的解决方案。
使用:
/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
。
它的开头三个字符都是字母。
它的第四个字符是一个空格。
它的第 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>