1

変数に基づいて動的行フィルターを作成しようとしています。次のコードがあります。

<xsl:variable name="filter" select="contain(@Title, 'title1') or contain(@Title, 'title2')"/>
<xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row[string($filter)]" />

残念ながら、これはうまくいかないようで、すべての行になってしまいます。$filter 変数の出力をコピーして貼り付け、それを Row[] にコピーして貼り付けると、期待どおりに機能するため、フィルターは実際には適用されないと思います。

誰もこれをやろうとしたことがありますか?

フィルター変数が、実際には、title1 - title2 - title3 のような文字列を分割し、contain(@Title, 'title1') または contain(@Title, 'title2') のような文字列を返すテンプレートを使用して作成されていることに疑問を持っている場合に備えて、 ) または (@Title, 'title3') を含む

どんな助けでも大歓迎です!

4

1 に答える 1

3

ここで試みているように見えることはできません。XPath 式はアトミックであり、その一部を保存して再利用することはできません (ただしcontains()、 ではなくcontain())。

次のようなものが必要です。

<xsl:variable name="Rows" select="
  /dsQueryResponse/Rows/Row[
    contains(@Title, 'title1') or contains(@Title, 'title2')
  ]
" />

あなたの「フィルター」は機能しませ$filterん。XPath に似ているからといって、魔法のような意味を持つわけではありません。;-)

これ

<xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row[string($filter)]" />

述語として空でない文字列に評価されます。また、空でない文字列はすべて true と評価され、式は存在するすべてのノードを返します。

入力文字列に基づく動的フィルターが必要な場合は、次のようにします。

<xsl:variable name="filter" select="'|title1|title2|title3|'" />
<xsl:variable name="Rows" select="
  /dsQueryResponse/Rows/Row[
    contains(
      $filter,
      concat('|', @Title, '|')
    )
  ]
" />

区切り文字を使用すると、「title1」を検索しても「title11」が表示されなくなります。

フィルタは常に区切り文字で開始および終了するようにし、@Title. (たとえば、 を使用できます&#13;。タイトルを複数行にできない場合、これはかなり安全です。)

于 2009-12-09T21:30:53.160 に答える