XPath: 匹配多个子元素中的一个

5

我有一个小应用程序,用于搜索出版物引用。这些引用是以XML格式呈现的,并且通过PHP将参数传递给XSLT,以按照作者或仪器等字段进行搜索。其结构如下:

<publications>
    <paper>
        <authors>
            <author>James Smith</author>
            <author>Jane Doe</author>
        </authors>
        <year>2010</year>
        <title>Paper 1</title>
        (more children)
    </paper>
    (more papers)
</publications>

当我在XSLT中调用我的模板时,我使用一个谓词根据搜索条件来缩小显示的论文范围。因此,如果设置了参数$author,我会执行以下操作:

<xsl:apply-templates select="paper[contains(authors/author, $author)]" />

问题:这适用于“作者”中的第一个作者,但忽略后面的作者。因此,在上面的示例中,搜索“Smith”会返回此论文,但“Doe”则没有任何返回。
如何格式化我的表达式以考虑所有“作者”元素?
1个回答

5
contains函数期望它的第一个参数是一个字符串,而不是一组节点。在您的表达式中,authors/author 的第一个结果被转换为一个字符串,然后传递给该函数。相反,使用测试每个author节点的谓词。
<xsl:apply-templates select="paper[authors/author[contains(., $author)]]" />

例如,看一下Saxon行为的解释:

(注:Saxon是一个Java编写的XSLT和XPath处理器)

谢谢!像梦一样顺利。 - tkm256

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接