1

XSLT の対応する when ステートメントで XML の ID フィールドに渡された値を参照するにはどうすればよいですか?

XML のスニペット:

<UserArea>
  <Id idOwner="Timekeeper"> 
      <IdValue>Time</IdValue> 
  </Id> 
</UserArea>

渡された IdValue に基づいて (Choose ステートメントを使用して) 条件ステートメントを作成したいと考えています。私が作成したものはすべて、When ステートメント用に作成した条件ステートメントを認識しないようです。いくつかの異なる構文を試しましたが、何も機能していないようですが、構文エラーは発生しません。ノードに入らず、True と評価されないようです。私が持っている最新のものは次のとおりです。

<xsl:when test="hr:Timekeeper = 'Time'">

また、このステートメントで「hr」が何を意味するのかわかりません..この XSLT に取り組んだ以前の人からそれをコピーしました。

すべての IF ステートメントは機能しますが、上記の WHEN ステートメントは機能しません。同じ XSLT で完全に機能するサンプル IF ステートメントは次のとおりです。

<xsl:if test="@idOwner = 'Timekeeper' and hr:IdValue !=''">
  ....do something
</xsl:if>

この構文では、属性の「@」基準は正しいですか?

私は XSLT を構築する初心者であり、主に既存の XSLT に非常に小さな編集を加えるだけで済みますが、小さな編集以上のことをしなければならないのはこれが初めてです。

thxs!

4

4 に答える 4

3

XSLT は XPath と呼ばれるクエリ構文を使用するため、これがどのように機能するかを完全に理解するために、XPath i を読むことをお勧めします。

XPath では、@プレフィックスを使用して属性を示すため、次のように動作するはずです。

<xsl:when test="@idOwner = 'Timekeeper'">

これにより、属性が現在のノードidOwnerと等しいかどうかがテストされます。Timekeeper

于 2013-10-17T06:00:27.060 に答える
1

XPath 式は、プレフィックスに依存して名前空間付きの要素を示します。接頭辞のない名前は、常に名前空間のない要素を参照します。あなたの入力XMLには、次のようなデフォルトの名前空間宣言があると思われます

xmlns="http://ns.hr-xml.org"

これにより、すべての要素が名前空間に配置されます。xsl:stylesheetしたがって、XSLT には、同じ名前空間 URI をプレフィックスにバインドするための一致する宣言があります。

xmlns:hr="http://ns.hr-xml.org"

hr:IdValuexpath で使用して、名前空間IdValue内の要素を選択できます。http://ns.hr-xml.org

は属性には適用されないため、属性名のxmlns="..."前に付ける必要はありません。idOwner

使用する必要がある正確な式は、現在のコンテキストによって異なります。現在のノードが要素であるコンテキストにいる場合Id(たとえば、直接内部<xsl:template match="hr:Id">)、使用する idOwner の値をテストしたい場合

test="@idOwner = 'Timekeeper'"

IdValue の場合

test="hr:IdValue = 'Time'"

両方一緒に使用するためand

test="@idOwner = 'Timekeeper' and hr:IdValue = 'Time'"

現在のコンテキストが親の UserArea 要素であり、これらの制約に一致する Idあるかどうかを確認したい場合は、次を使用します

test="hr:Id[@idOwner = 'Timekeeper' and hr:IdValue = 'Time']"
于 2013-10-17T07:04:19.530 に答える
1

hr: は名前空間であり、ColinE の答えに加えて、この例では必要ありません。ノードの内容はテキストノードであるため、テスト ステートメントは次のようになります。

<xsl:when test="@idOwner = 'Timekeeper' and IdValue/text() != ''>
于 2013-10-17T06:25:36.277 に答える
0

誰かがこの投稿をもう見ているのかどうかはわかりませんが、対処する必要がある条件を参照するために、XSLT で関数を作成する必要がありました。私は何人かの年長者と一緒にこれに取り組んでいました (私よりもはるかに長くコーディングしてきました)、彼らも私たちの choose ステートメントを機能させることができませんでした。この問題は、当初の計画を放棄し、XSLT で関数呼び出しを作成してノードに入力する名前を決定することで解決されました。

于 2013-10-22T02:33:58.463 に答える