如何使用xslt代码比较节点?

时间:2016-06-29 21:25:43

标签: html xml xslt xslt-2.0

我有一个示例xml

<ConditionTable>
    <incondition name = "abc" />
    <incondition name = "xyz" />
    <outconditon name = "abc" />
    <outcondition name = "xyz" />
    <job name = "hello world" />
</ConditionTable>

<ConditionTable>
    <incondition name = "abc" />
    <incondition name = "xyz" />
    <outcondition name = "xyz" />
    <outcondition name = "xyz" />
    <job name = "hello world2" />
</ConditionTable>

我正在尝试编写一个xslt,以便如果所有的附加名称至少有一个匹配的条件名称,则会打印作业名称。到目前为止,我有这样的事情:

<xsl:for-each select="ConditionTable/incondition ">
    <xsl:if test="(current()/@name = ../outcondition/@name)"
        <xsl:value-of select="../job/@name" />
    </xsl:if>
</xsl:for-each>

但它会打印两个作业名称。如果不满足至少一项补充,我不应该打印工作名称。

3 个答案:

答案 0 :(得分:0)

让您的测试结果为负 - 例如:

<xsl:for-each select="ConditionTable">
    <xsl:variable name="t" select="." />
    <xsl:if test="not(incondition[not(key('out', @name, $t))])">
        <xsl:value-of select="job/@name" />
    </xsl:if>
</xsl:for-each>

其中密钥定义为:

<xsl:key name="out" match="outcondition" use="@name"/>

答案 1 :(得分:0)

  

如果所有的附加名称都至少有一个匹配的条件名称

最直接的表达方式是XPath 2.0表达式

test="every $i in incondition satisfies 
        some $o in outcondition satisfies
           $i eq $o"

您可以通过利用A=$b表示some $a in A satisfies $a eq $b,给您

的事实来缩写
test="every $i in incondition satisfies 
        $i = outcondition

如果你想让它更简洁,你可以利用every X satisfies Y转换为not(some X satisfies not(Y))的事实,这会给你

test="not(some $i in incondition satisfies not($i = outcondition))"

进一步简化为:

test="not(incondition[not(.=outcondition)])"

但对于某些品味而言,这可能有点简洁。

答案 2 :(得分:0)

假设对'outcondition'的'incondition'检查应该只在同一个ConditionTable中完成。

试试这个XSLT 1.0:

    <xsl:for-each select="ConditionTable">
        <xsl:if test ="not( incondition[ not( ../outcondition/@name = @name ) ] )" >
            <xsl:value-of select="../job/@name" />
        </xsl:if>
    </xsl:for-each>