XSLT测试是否存在任何键控节点

时间:2012-07-15 00:38:37

标签: xslt

变量$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>

1 个答案:

答案 0 :(得分:1)

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

在大多数情况下会返回false(),因此“索引”的整个方法不正确

这是因为从转换到转换,XML文档中任何节点的generate-id()值都不能保证相同。

即使在提供的XML文档中,生成的任何node/@id属性在第二个文档的某个特定节点上具有generate-id()的值,也不能保证在后续的新转换中{{1}在同一节点上将产生与用于生成相应generate-id()的值相同的值。

推荐

对于这样的索引,使用一个更稳定的节点函数 - 这种函数的一个例子是XPath表达式,它精确地选择该节点。

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

<强>更新

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

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

node/@id

在条件指令的boolean($set[generate-id() = someExpression/row/node/@id]) 属性中,只能使用上面test的参数。

<强>解释

表达式:

boolean()

选择$set[generate-id() = someExpression/row/node/@id])] $set的值等于至少一个generate-id()属性值的所有节点(someExpression在这里代表缺少的位置步骤,我们什么都不知道,因为没有已提供XML文档。

根据定义,如果节点集someExpression/row/node/@id包含至少一个节点,则boolean($someNodeSet)始终为true(),如果$someNodeSet为空节点集,则$someNodeSet为假。