2017-10-21 4 views
0

XSLT 2または3の処理があり、XSLテンプレートにパラメータとして単一の文字列を渡します。この仕事のために、<person>の要素を複数のXML文書で見つけ出すために使用される姓を渡しています。<nL>という名前ですが、最後に要素が渡されたパラメータと一致します。これは動作しますが、カンマで区切ったパラメータを渡せるようにXPATH式を変更したいと思います。たとえば、surname = "Johnson"を渡すことができますが、surname = "Johnson、Johnston"を渡すことができます。XPATHの述部で変数の値を一致させる方法

私はJavaで最新のSaxonプロセッサを使用しています。私はすべての-sources.xmlのは、他のXMLファイルのXMLフォーマットさリストである

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

で変換を呼び出します。

もっと必要な場合を除いて、私は自分のコードの小さな部分だけを含めます。これはおそらく私が理解していない単純なXPATHの問題です。

は、現在、私のテンプレートの試合前に、私は次の変数

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

この作品にマッチし<person>の要素を見つける

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

このパラメータの宣言を持っている場合$姓変数は1ワードの文字列です。 $ surnameにカンマで区切られた2つ以上の単語を含めることができるように、上記の述語をどのように変更できますか?

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 ="ドキュメント(/ files/file/@ filename)に変更しました// person [matches (nL、$ surname)] ""これは私に望ましい結果を与えます。助けてくれてありがとう – Sawtooth67

答えて

2

あなたはその後、例えばとの一連の文字列を作成するためにtokenizeを使用<xsl:param name="surnames" as="xs:string" required="yes"/>を維持した場合<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式であることを示しています。次に、完全な式をSaxonに渡すために必要なコマンドシェルによって異なります。

+0

Martin、私がLesiakのスレッドで見つけた解決策に加えて、私はあなたの最初の提案をテストし、作業と望ましいソリューションも得ました。時間をとっていただきありがとうございます。 - マイケル – Sawtooth67

関連する問題