0

次のケースを検討してください。

<xsl:variable name="list">
   <row>
     <webid>2</webid>
   </row>
   <row>
     <webid>3</webid>
   </row>
   <row>
     <webid>4</webid>
   </row>
</xsl:variable>

<!--pseudo code, not sure if it will work in real time-->
<xsl:variable name="addr" select="addresses/item[not(id=$list/webid)]"/>

にない ID を持つアドレス項目をフィルタリングしたい$list webid collection。私が投稿した表現はうまくいきますか?ご意見をお聞かせください。

4

2 に答える 2

2

XSLT 1.0 では、そのような変数宣言は結果ツリー フラグメントであり、ノード セットではありません。これで実行できるのは or のみですcopy-of。XPathvalue-of式を使用してその中に移動することはできません。どちらかにする必要があります

  1. exslt:node-setなどの拡張関数を使用して、RTF を実際のノード セットに変換するか、
  2. とのトリックを使用してdocument('')、スタイル シート自体に XML ドキュメントとしてアクセスします。

オプション 2 は、変数値が静的 XML である例のような場合にのみ機能します。xsl:コマンドまたは属性値テンプレートを使用して値が構築された変数がある場合、たとえば

<xsl:variable name="allNames">
  <xsl:for-each select="name">
    <person name="{.}" />
  </xsl:for-each>
</xsl:variable>

次に、node-set関数を使用する必要があります。このdocument('')アプローチでは、評価の結果ではなく、name 属性の実際のxsl:for-each要素とリテラル値が得られます。{.}

オプション1

タグに追加xmlns:exslt="http://exslt.org/common" exclude-result-prefixes="exslt"してから使用します<xsl:stylesheet>

<xsl:variable name="addr" select="addresses/item[
     not(id=exslt:node-set($list)/row/webid)]"/>

オプション 2

<xsl:variable name="addr" select="addresses/item[
     not(id=document('')//xsl:variable[name='list']/row/webid)]"/>
于 2013-09-25T13:07:31.283 に答える
0

I put not(addresses/item[id=$list/webid])

于 2013-09-25T13:50:24.413 に答える