如何匹配XPATH中谓词中变量的值

时间:2017-10-21 00:37:47

标签: xml xslt xpath xslt-2.0

我有一个有效的XSLT 2或3进程,我将一个单词字符串作为参数传递给XSL模板。对于此任务,我传递一个姓氏,用于查找多个XML文档中的所有<person>元素,其中包含子<nL>,名称为last,元素与我传递的参数匹配。这有效,但我想修改我的XPATH表达式,以便能够传递逗号分隔的参数。例如,我现在可以通过surname =“Johnson”但希望能够通过surname =“Johnson,Johnston”

我在java中使用最新的Saxon处理器。我用

调用转换

java net.sf.saxon.Transform -s:all-sources.xml -xsl:xsl/index-person-param.xsl surname="Johnson"

all-sources.xml是XML格式的其他XML文件列表。

除非需要更多代码,否则我只会包含一小部分代码。这可能是一个简单的XPATH问题,我只是不明白。

目前在我的模板匹配之前,我有这个参数声明

<xsl:param name="surname" as="xs:string" required="yes"/>

然后我找到所有匹配的<person>元素和以下变量

<xsl:variable name="nameMatch" select="document(/files/file/@filename)//person[nL = $surname]"/>

当$ surname变量是单字符串时,这种方法有效。我怎样才能修改上面的谓词,以便$ surname可以包含两个或多个用逗号分隔的单词?

我已尝试使用tokenize()contains()进行多次更改,但我仍然没有找到可行的解决方案。 谢谢, 迈克尔

1 个答案:

答案 0 :(得分:2)

如果您保留<xsl:param name="surnames" as="xs:string" required="yes"/>,请使用tokenize创建一系列字符串,例如<xsl:param name="surname-seq" as="xs:string*" select="tokenize($surnames, '\s*,\s*')"/>然后比较nL = $surname-seq

或者将参数更改为一系列字符串,例如<xsl:param name="surname" as="xs:string*" required="yes"/>,然后,在命令行上,您需要确保使用例如?surname="'foo','bar'"。您将不得不测试哪些引号组合有效,问号?surname表示该值是XPath表达式,然后它取决于您使用所需的命令shell以确保将完整表达式传递给Saxon。