变量$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>0">
<!-- go ahead and process the row -->
</xsl:if>
</xsl:for-each>
答案 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
为假。