2

与えられた

<xsl:variable name="datePrecision" as="element()*">
  <p>Year</p>
  <p>Month</p>
  <p>Day</p>
  <p>Time</p>
  <p>Timestamp</p>
</xsl:variable>

表現

$datePrecision[5] 

予想どおり、値「Timestamp」を持つ 1 つのテキスト ノードを含む nodeSet を返します。

テンプレートの後半で、コンテキスト要素が属性を持つ

@precision="5"

次の式を試してみましたが、すべて空の文字列が返されます。

$datePrecision[@precision]
$datePrecision[number(@precision)]
$datePrecision[xs:decimal(@precision)]

ただし、次のシーケンスは私が望むことを行います

<xsl:variable name="prec" select="number(@precision)"/>
... $datePrecision[$prec] ...

Oxygen/XML のデバッガーを使用して、式が評価されようとしているところまで進み、ウォッチ ウィンドウに次のように表示します。

Expression                          Value            Nodes/Values Set
--------------------------          ---------------  -----------------------
$datePrecision[5]                   Node Set(1)      #text Timestamp
@precision                          Node Set(1)      precision 5
$datePrecision[@precision]  
number(@precision)                  5
$datePrecision[number(@precision)]  
$prec                               5
$datePrecision[$prec]               Node Set(1)      #text Timestamp

明らかに、述語で使用するために属性ノードを原子化する方法について基本的なことを見逃していましたが、この違いを説明するドキュメント (Michael Kay の XSLT/XPATH 2.0、第 4 版) には何も見つかりません。

誰かがなぜこれが起こっているのかを説明し、XSLT 2.0仕様またはMichael Kayの本で、これが説明されている場所を教えてもらえますか?

(XSLT プロセッサは Saxon-PE 9.2.0.3 です)

4

1 に答える 1

1

明らかに、私は何か基本的なことを見逃しています

はいXPath 式:

$datePrecision[@precision]

意味$datePrecision:という名前の属性を持つすべての要素precision

ただし、テンプレートに一致する currnet ノードの@precision名前の属性を意味する必要があります。precision

XSLT はcurrent()まさにこの目的のための機能を提供します。使用:

 $datePrecision[current()/@precision]

更新: Martin Honnen が示唆したように、OP はおそらく 5 番目の要素を取得したいと考えて$datePrecisionいます。これは、問題の説明からすぐには見えないものです。この場合、以下を使用する必要がある場合があります。

 $datePrecision[position() = current()/@precision]
于 2010-04-02T16:04:44.957 に答える