1

一个变量$rows有一个节点 ID 列表,这些节点 ID 是一些源 XML 的键。

<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 文档node/@id中生成的任何属性generate-id()在第二个文档的某个特定节点上的值都generate-id()为各自的node/@id.

建议

对于此类索引,请使用更稳定的节点函数——此类函数的一个示例是恰好选择该节点的 XPath 表达式。

如果文档没有被修改,那么 XPath 表达式将始终选择该节点。

更新

在评论中,OP 认为node/@id属性是在同一个转换中生成和使用的。

在这种情况下,这个单一的 XPath 表达式生成一个布尔值,指示是否$set至少包含一个节点,该节点generate-id()node/@id另一个文档的属性之一:

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

test条件指令的属性中,只能boolean()使用上述参数。

说明

表达方式:

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

$set选择其值generate-id()等于至少一个属性值的所有节点someExpression/row/node/@id(这里的 someExpression 代表缺失的位置步骤,我们对此一无所知,因为没有提供 XML 文档)。

根据定义,boolean($someNodeSet)如果true()节点集$someNodeSet至少包含一个节点,则为 false,如果$someNodeSet为空节点集,则为 false。

于 2012-07-15T03:32:57.087 回答