2

次の方法で、いくつかの可能なパスをテンプレートに一致させようとしている状況があります。

<xsl:template match="blah">
  <xsl:apply-templates select="foo/*/baz" mode="someMode"/>
</xsl:template>

<xsl:template match="*" mode="someMode">
  <xsl:if test="current() != 'foo/bar/baz' and
                current() ! ='foo/bam/baz'">

    <!-- Process here --> 

  </xsl:if>
</xsl:template>

ご覧のとおり、「foo」の下には「baz」要素を持つ要素がいくつでも存在する可能性があります(たとえば、「bar」、「bam」、「bal」、「bav」など)。そのうちの約2つ、「bar」と「bam」。私はこれらのものを処理したくありませんが、他のものは処理します。残念ながら、current()メソッドは一致したパスを返さないため、テストは常に成功します(パスが「foo / bar/baz」または「foo/bam /baz」の場合でも)。

if-testで一致したパスを取得するにはどうすればよいですか?

注意:他の場所で(他の方法で)処理されているため、「foo / bar/baz」および「foo/bam /baz」に特に一致する他のxsl:template要素を使用することはできません。

4

2 に答える 2

2

このcurrent関数はパスを返しません。現在のコンテキストノードを返します(つまり、[]述語の外側は、とまったく同じです。.述語の内側は、その.外側にある値です)。

を使用するのではなく、不要な特定の要素に一致するもの<xsl:if>に対してno-opテンプレートを定義する必要がありますそうすると、メインテンプレートは必要な要素に対してのみ起動ます。someMode*

<xsl:template match="foo/bar/baz | foo/bam/baz" mode="someMode" />

<xsl:template match="*" mode="someMode">
  <!-- Process here -->
</xsl:template>

あなたはそれを言います

注意:他の場所で(他の方法で)処理されているため、「foo / bar/baz」および「foo/bam /baz」に特に一致する他のxsl:template要素を使用することはできません。

ただし、これがモードの要点です。他のfoo/bar/bazモードの既存のテンプレートは、以前と同じように機能します。

于 2013-03-07T19:15:43.863 に答える
0

foo / bar/bazおよびfoo/bam/bazに一致するmode="someMode"を持つ他のテンプレートがある場合、そのモードで*に一致するテンプレートはそのような要素で起動することはなく、条件付きのテストは常にあなたが望むことを言うためにそれを再定式化したとしても真実です。

ifパターンfoo/bar/bazまたはfoo/bam / bazに一致する特定の要素が他の場所に一致するかどうか完全に確信が持てず、ステートメント内のコードがその要素に対して起動しないことを確認したい場合は、テストを次のように再キャストできます

test="not(self::baz/parent::bar/parent::foo
          or self::baz/parent::bam/parent::foo)"

多くのXSLTプログラマーは、テンプレートの一致パターンの述語にそのテストを追加することで、別の方法で記述します。

<xsl:template mode="someMode" 
              match="*[not(self::baz/parent::bar/parent::foo
                      or self::baz/parent::bam/parent::foo)]">
  <!-- process ... -->
</xsl:template>
于 2013-03-07T19:17:45.060 に答える