我有一个示例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>
但它会打印两个作业名称。如果不满足至少一项补充,我不应该打印工作名称。
答案 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>