我有一些看起来像这样的XSLT代码:
<xsl:variable name="writerFind" as="xs:string*">
<xsl:sequence select="('screenplay by ','written by ','written and directed by ')"/>
</xsl:variable>`
<xsl:for-each select="1 to count($writerFind)">
<xsl:variable name="x">
<xsl:value-of select="."/>
</xsl:variable>
<xsl:variable name="writer"
select="functx:contains-any-of($cell3Data, subsequence($writerFind, $x, 1))"/>
<xsl:variable name="writerEnd" as="xs:string*">
<xsl:sequence select="(' ;','.')"/>
</xsl:variable>
这个函数检查$ cell3Data(这只是一个normalize-space()版本的节点,因为存在那些$ writerFind触发词(后面可以添加更多)然后返回一块触发后节点的值。
<xsl:function name="fun:contains-any-of" as="xs:string" xmlns:fun="http://www.fun.com">
<xsl:param name="arg" as="xs:string?"/>
<xsl:param name="searchString" as="xs:string"/>
<xsl:sequence
select="if (contains($arg,$searchString))
then substring-after($arg, $searchString)
else ''"
/>
</xsl:function>
我想要做的事情,并且继续磕磕绊的是创建第二个函数,它在遇到$ writerEnd触发器之前返回新$ writer的值。
即。当节点说&#34;电影是由约翰史密斯写的;爱德华琼斯导演#34;返回值是&#34; John Smith&#34;
当节点显示Bob Links的电影剧本时。&#34;返回值是&#34; Bob Links&#34;
第一个功能正常,第二个功能给我带来各种麻烦。想法?
答案 0 :(得分:2)
首先,您的代码比应该更难理解。主要原因是你选择的函数名称很差,听起来好像它接受了一串字符串并返回一个布尔值;然后,在调查中,似乎你的函数与内置函数substring-after完全相同。我就是这样写的:
<xsl:variable name="writerFind" as="xs:string*"
select="('screenplay by ','written by ','written and directed by ')"/>
<xsl:for-each select="1 to count($writerFind)">
<xsl:variable name="x"
select="."/>
<xsl:variable name="writer"
select="substring-after($cell3Data, $writerFind[$x])"/>
<xsl:variable name="writerEnd" as="xs:string*"
select="(' ;','.')"/>
关于你问题的实质内容,我会使用正则表达式:
replace($writer, '[;\.].*$', '')