1

変数$rowsには、何らかのソース XML にキーを設定するノード ID のリストがあります。

<row>
   <node id="d0113" />
   <node id="d0237" />
   <node id="d0321" />
</row>
<row>
   <node id="c0278" />
   <node id="d0137" />
   <node id="e0021" />
</row>

<row>各を処理する前に、ノードセットに実際に存在するようにキー設定されたノードがあるかどうかをテストする良い方法は何$setですか?

私が思いついたのは

<xsl:for-each select="row">
  <xsl:variable name="test">  
    <xsl:for-each select="node">
      <xsl:value-of select="boolean($set//*[generate-id()=current()/@id]) * 1"/>
    </xsl:for-each>                  
  </xsl:variable>
  <xsl:if test="$test&gt;0">
    <!-- go ahead and process the row -->
  </xsl:if>
</xsl:for-each>
4

1 に答える 1

1
  <xsl:value-of select="boolean($set//*[generate-id()=current()/@id]) * 1"/>

これはほとんどの場合に返さfalse()れるため、この「索引付け」の方法全体が正しくありません

これはgenerate-id()、XML ドキュメント内のノードの値が、変換ごとに同じであるとは限らないためです。

提供された XML ドキュメントで、2 番目のドキュメントの特定のノードでnode/@id値を持つように属性が生成されたとしても、その同じノードでgenerate-id()の結果的な新しい変換で、生成に使用された値と同じ値が生成されるという保証はありません。generate-id()それぞれのnode/@id

おすすめ:

そのような索引付けには、ノードのより安定した関数を使用します。そのような関数の 1 つの例は、そのノードを正確に選択する XPath 式です。

ドキュメントが変更されていない場合、その XPath 式は常にそのノードを選択します。

更新

コメントでは、OP は、node/@id属性が生成され、同じ変換で使用されることを維持します。

この場合、この単一の XPath 式は、別のドキュメントの属性の1 つである$setノードが少なくとも 1 つ含まれているかどうかを示すブール値を生成します。generate-id()node/@id

boolean($set[generate-id() = someExpression/row/node/@id])

条件付き命令のtest属性では、boolean()上記の引数のみを使用できます。

説明:

表現:

$set[generate-id() = someExpression/row/node/@id])]

$setの値がgenerate-id()少なくとも 1 つの属性の値と等しいすべてのノードを選択しsomeExpression/row/node/@idます (ここでの someExpression は、XML ドキュメントが提供されていないため、何もわかっていない欠落しているロケーション ステップを表します)。

定義により、ノード セットに少なくとも 1 つのノードが含まれている場合boolean($someNodeSet)は常にであり、が空のノード セットである場合は false です。true()$someNodeSet$someNodeSet

于 2012-07-15T03:32:57.087 に答える