次のSQLクエリに相当するものが必要です。
タイトルが「V」で始まり、3文字が続き、スペースが続き、文字列が続くすべての映画を選択します(例:ヴァンヘルシング)
SELECT * FROM films WHERE title LIKE ="V__ %";
xsltでphpを使用するので、films / film / title、xpath1.0などのツリーでこれをxpath1.0式にするにはどうすればよいですか。
ありがとうございました
スペースの後の文字列を表示できなくても大丈夫ですか?次に、次を使用できます。
//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]
現在受け入れられている回答が、一致しない選択基準要素を誤って選択していることに注意してください。この回答の最後を参照してください。
これが正しい解決策です。
使用:
/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
ます。
最初の3文字はすべて文字です。
その4番目の文字はスペースです。
その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式が評価され、選択された要素(この場合は1つのみ)が出力にコピーされます。
<title>Van Helsing</title>
現在受け入れられている回答では、一致しない次の2つの要素が誤って選択されていることに注意してください。
<title>Van Helsing</title>
<title>Van Helsing2</title>