XSLT:检查节点集中的值是否存在于另一个节点集中

时间:2017-07-13 15:23:56

标签: xslt xpath xslt-1.0

所以,我有两个变量,每个变量包含一个节点集(A和B)。我需要在节点集B中对行进行计数,其中@id存在于节点集A中。

这可能吗?如果是这样,我不确定如何在xslt 1.0中编写这个xpath?

<xsl:value-of select="count($B[])"/>

1 个答案:

答案 0 :(得分:0)

从你的问题中不清楚这是否是你所需要的。也就是说,这种问题并不少见。

假设数据如下:

<?xml version="1.0" encoding="utf-8"?>
<test>
    <nodeset_a>
        <item id="1"/>
        <item id="2"/>
        <item id="3"/>
        <item id="4"/>
        <item id="2"/>
    </nodeset_a>
    <nodeset_b>
        <item id="1"/>
        <item id="4"/>
        <item id="5"/>
        <item id="6"/>
        <item id="7"/>
    </nodeset_b>
</test>

您的问题听起来好像想要计算nodeset_bididnodeset_a值与<xsl:value-of select="count(/test/nodeset_b/item[@id = /test/nodeset_a/item/@id])"/> 值匹配的项目数。以下表达式将生成正确的计数:

nodeset_b

更新 - 否定

相反的情况可能有点棘手 - 在id中查找idnodeset_a没有匹配<xsl:variable name="Rows" select="/test/nodeset_b/item[@id != /test/nodeset_a/item/@id]"/> item值的项目}。

乍一看,您可能会想到以下内容:

nodeset_b

然而,这不能解决我们的问题。

打破这一点,它的作用是找到id中所有id元素的nodeset_a值不匹配一个的元素id中的nodeset_a值。无论哪一个:只要item中的任何nodeset_b值不匹配,此XPath评估将从<test>返回5。对于上面的item数据,这会返回所有数据,计算出nodeset_b

要查找id中所有idnodeset_a元素,其<xsl:variable name="Rows" select="/test/nodeset_b/item[not(@id = /test/nodeset_a/item/@id)]"/> 值与 <test>值中的item值不匹配nodeset_b,我们不仅要否定等号,而是否定比较表达式本身:

id

对于上面的id数据,这只会返回nodeset_a3值与任何不匹配的select to_string(meta().cas) from sampledb where type = "PROD" and Id = "PROD_101" 个元素$('#login').click(function(e) { e.preventDefault(); $('#main').fadeOut('slow', function() { $(this).html($('#hidden-login-div').html()).fadeIn('fast'); }); }); 中的{{1}}值,正确计算{{1}}。