Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 如何根据其他节点列表的内容筛选节点列表_Xslt - Fatal编程技术网

Xslt 如何根据其他节点列表的内容筛选节点列表

Xslt 如何根据其他节点列表的内容筛选节点列表,xslt,Xslt,我想使用XSLT根据另一个节点列表的内容过滤节点列表。具体来说,我想过滤节点列表,以便从结果节点列表中删除具有相同id属性的元素。应优先考虑两个节点列表中的一个 我最初设想的实现方式是这样: <xsl:variable name="filteredList1" select="$list1[not($list2[@id_from_list1 = @id_from_list2])]"/> 问题是$list2的谓词中的上下文节点发生了变化,因此我无法从_list1访问属性@id_。由于

我想使用XSLT根据另一个节点列表的内容过滤节点列表。具体来说,我想过滤节点列表,以便从结果节点列表中删除具有相同id属性的元素。应优先考虑两个节点列表中的一个

我最初设想的实现方式是这样:

<xsl:variable name="filteredList1" select="$list1[not($list2[@id_from_list1 = @id_from_list2])]"/>
问题是$list2的谓词中的上下文节点发生了变化,因此我无法从_list1访问属性@id_。由于这些范围限制,我不清楚如何能够以这种方式使用嵌套谓词引用外部节点列表中的属性

为了解决上下文节点的问题,我尝试创建一个包含for-each循环的解决方案,如下所示:

    <xsl:variable name="filteredList1"> 
        <xsl:for-each select="$list1">
            <xsl:variable name="id_from_list1" select="@id_from_list1"/>

            <xsl:if test="not($list2[@id_from_list2 = $id_from_list1])">
                <xsl:copy-of select="."/>
            </xsl:if>
        </xsl:for-each>
    </xsl:variable>
但这并不正确。我也不清楚它是如何失败的。。。使用上述技术,filteredList1的长度为1,但似乎为空。这是一种奇怪的行为,无论如何,我觉得一定有一种更优雅的方法


我很感激任何人能提供的指导。谢谢。

据我所知,使用$var[]语法不起作用。工作原理是:expr1/[expr2=$var]和func1$var

您可以做的只是将生成$list2的表达式嵌入到if测试中:

<xsl:for-each select="$list1">
  <xsl:variable name="id" select="@id_from_list1"/>
  <xsl:if test="not(expr2[@id_from_list2 = $id ])">
    <xsl:copy-of select="."/>
  </xsl:if>
</xsl:for-each>
<xsl:copy-of select="$list2"/>
用实际表达式替换expr2。

使用XPath单行程序:


$vList1[not@id=$vList2/@id]

@user268396,感谢您的回复$var[]语法确实有效。这里有一个例子。XSL:;XML:;输出:States:Compound1 Basic1 Basic2 Basic3基本状态:Basic1 Basic2 Basic3使用xalan和xsltproc测试。好问题+1。请参阅我的一行解决方案:@oillio:这意味着您真的不知道XPath=运算符的语义。如果其中一个参数是节点集,则如果此节点集中存在比较为真的节点,则比较为真。请阅读并学习。