2012-04-06 7 views
1

XSL:では、<xsl:if test = "。[foo or @bar]">とは何か、クロスブラウザソリューションとは何ですか?

<xsl:if test=".[foo or @bar]"> 
    something 
</xsl:if> 
  1. それがあれば、ターゲットが 'foo' でタグ名であるか 'バー' 属性を持っていることをテストしていますか?

  2. IEでのみ動作します。エラーがあるのでしょうか?同等の文は何ですか?しかし、クロスブラウザで動作しますか?

答えて

0
<xsl:if test=".[foo or @bar]">  
    something 
</xsl:if> 

を、これは構文的に無効であり、エラーを生成します。 XSLT 2.0で

このと等価である:

<xsl:if test="foo or @bar">  
    something 
</xsl:if> 

foo or @bar 

コンテキストノード(現在のノード)という名前の子要素を有する正確場合true()と評価fooまたはコンテキストノードには、bar(またはその両方)という名前の属性があります。

これ以外の場合、この式はfalse()と評価されます。その後、出力文字列「何か」

- 現在のノードが fooという名前の子要素を持っているか、現在のノードが barという名前の属性を持っています

したがって、上記のコードの意味:これらの条件のいずれかに該当する場合

+0

XSLT 2.0です。そのため、ブラウザ間に矛盾があります。どうもありがとう。 – gfaceless

+0

@gfaceless:*現在、すべての*ブラウザはXSLT 1.0のみを使用しています。おそらくIE6のXSLTプロセッサにバグがあります。とにかく、すべては 'fooまたは@ bar'を受け入れるべきです - これは、同じxブラウザの動作を保証するための修正です。ところで、あなたはそれの隣のチェックマークをクリックすることで、最も役に立つ答えを受け入れるかもしれません: –

+0

私はそのことを知らなかったし、チェックマーク: – gfaceless

0

これは、現在のノードがfooという名前の子要素を持っているか、barと呼ばれる属性を持っているかどうかをテストします。それはあなたが

<xsl:if test="foo or @bar"> 

あなたは私のXSLパーサに拒否された使用する構文に変更した場合、次のとおりです。Invalid XPath expression Unexpected token - "[foo or @bar]"

私はクロスブラウザを使用して動作するはずです1。
名前fooまたはbar属性を持つノードを、選択したい場合は、次のようにします。XSLT 1.0で

<xsl:if test="name()='foo' or @bar"> 
+0

私はそれがエラーだと思っていましたが、IE6はそれを無視するほど強いです。あなたの詳細な説明をありがとう。 – gfaceless

2

構文.[x]は、XSLT 1.0では使用できません。 XSLT 1.0の初期のドラフトでは許可されていましたが、意図的な設計の決定ではなく、見落としの結果として最終版に欠けていたと思われます(すでに述べたように、XSLT 2.0では復活しました)。 1.0仕様が完成する前にIEが最初にXSLTプロセッサを出荷したため、初期のドラフトとの下位互換性のためにこの構文をサポートする可能性があります。

+0

soそれが歴史です。 – gfaceless

関連する問題