2017-10-21 130 views
0

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

我在java中使用最新的Saxon处理器。我调用转换与

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

全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可以包含用逗号分隔的两个或多个单词?

我已经尝试过使用tokenize()和进行了一些更改,但我仍未找到可行的解决方案。 谢谢, 迈克尔

+1

你有没有尝试过这些:https://stackoverflow.com/questions/6357166/how-to-compare-against-multiple-strings-in-xslt – Lesiak

+0

我通过你提供的线程搜索并找到了解决方案。我已将'select =“文档(/ files/file/@ filename)// person [nL = $ surname]”'更改为'select =“document(/ files/file/@ filename)// person [matches (nL,$姓氏)]“'这给了我想要的结果。非常感谢 – Sawtooth67

回答

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。

+0

Martin的帮助,除了我在Lesiak提供的线索中找到的解决方案之外,我还测试了您的第一个建议并获得了工作和期望的解决方案。再次感谢您花时间教授。 -Michael – Sawtooth67