2017-10-21 135 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