创建新功能

时间:2014-08-10 02:02:39

标签: xml xslt xslt-2.0

我有一些看起来像这样的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;

第一个功能正常,第二个功能给我带来各种麻烦。想法?

1 个答案:

答案 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, '[;\.].*$', '')