我有一个有效的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()
进行多次更改,但我仍然没有找到可行的解决方案。
谢谢,
迈克尔
答案 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。