web-dev-qa-db-ja.com

XSLT:「一致」属性でORを表す方法は?

「A」または「B」という名前に一致する要素に対して一連の操作を実行したいと思います。以下のようなことを考えていますが、うまくいきません。

<xsl:template match= " 'A' or 'B'" >
     <!-- whatever I want to do here -->
</xsl:template>

適切なXSLT言語リファレンスが見つかりませんでした。助けてください!ありがとう!

27
tomato

これを試して:

<xsl:template match= "A | B" >

詳細はこちらのページをご覧ください。

38
David

一般的に、_A | B_はこれを行う正しい方法です。ただし、パイプ文字は基本的に2つの完全なXPath式の和集合です。次のような場合に使用すると煩わしい場合があります。

_/red/yellow/blue/green/gold | red/orange/blue/green/gold
_

式の1つの小さな部分を除いて、式全体を繰り返しているので、その変化があります。

このような場合、代わりに述語とname()関数を使用することが理にかなっていることがよくあります。

_/red/*[name() = 'yellow' or name()='orange']/blue/green/gold
_

この手法により、はるかに幅広い論理演算にアクセスできます。また、XPathナビゲーターは、テストしているノードを1回トラバースするだけでよいため、(おそらく)高速です。

27
Robert Rossney

このXPathを使用する方が便利だと思います

/red/(yellow | orange)/blue/green/gold

のではなく

/red/*[name() = 'yellow' or name()='orange']/blue/green/gold
12
Daniel

<xsl:template match= " 'A' or 'B'" >

この一致パターンにはいくつかの問題があります

  1. テンプレートは、文字列ではなく、ノードに一致します。したがって、照合する要素の名前を引用符で囲まれた文字列として指定しないでください。

  2. XPath演算子 "または"は、ノードではなく、2つのブール値に作用します。ここで必要なのは 別のXPath演算子-union演算子 "|"

上記を考慮して、テンプレートルールを次のように正しく指定します。

<xsl:template match= "A | B" >
     <!-- whatever I want to do here -->
</xsl:template>
6

以下の情報は以下から収集されました: http://www.cafeconleche.org/books/bible2/chapters/ch17.html#d1e209

言い換えると、「or演算子を使用する|」というテキストを検索してください。その文書で。

構文は次のとおりです。

<xsl:template match="A|B">
   <!-- Do your stuff> -->
</xsl:template>
1
qxotk