XPath:匹配多个孩子中的一个

时间:2011-07-06 19:15:43

标签: xml xslt xpath

我有一个搜索出版物引文的小应用程序。引用是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 个答案:

答案 0 :(得分:5)

contains函数需要一个字符串作为其第一个参数,而不是一组节点。使用表达式,authors/author的第一个结果将转换为字符串,然后传递给函数。

相反,使用一个独立测试每个author节点的谓词:

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

例如,参见撒克逊人行为的这种解释: