如何检查一个XML中的节点值是否存在于具有特定属性的另一个XML中?

时间:2010-06-03 10:25:42

标签: xml xslt

这个问题似乎有点混乱。所以让我通过一个例子描述我的情况:

假设我有一个XML: A.XML

<Cakes>
    <Cake>Egg</Cake>
    <Cake>Banana</Cake>
</Cakes>

另一个XML:B.xml

<Cakes>
    <Cake show="true">Egg</Cake>
    <Cake show="true">Strawberry</Cake>
    <Cake show="false">Banana</Cake>
</Cakes>

现在我想显示一些文字说“ TRUE ”,如果A.xml中的所有蛋糕都show="true"中的B.xml FALSE < /强>”。

在上述情况下,它将打印为FALSE。

我需要为此开发一个XSL。我可以循环遍历A.xml中的所有Cake并检查该蛋糕在B.xml中是否有show =“true”但是如果show =“false”我不知道如何打破(并设置变量)找到了。

有可能吗?任何帮助/意见表示赞赏。

4 个答案:

答案 0 :(得分:1)

这里的问题是你不能在XSL中更新变量; XSL变量仅分配一次,但可以有条件地分配。

我认为更简单和更合理的选择是使用较小的XSL片段,并以编程语言编程,可以使用XPath进行描述。

答案 1 :(得分:1)

<xsl:choose>
<xsl:when test="count(document('B.xml')/Cakes/Cake[@show='true' AND text() = /Cakes/Cake/text()]) = count(/Cakes/Cake)">
true
</xsl:when>
<xsl:otherwise>
false
</xsl:otherwise>

应该帮助你(不是100%肯定)

答案 2 :(得分:1)

我认为最好的方法是:

“A.xml”中是否至少有一个元素“Cake”没有与“B.xml”中任何元素“Cake”相同的字符串值,其属性“show”为“true” ?

所以,在xpath 1.0中:

文件('A.xml')/ Cakes / Cake [not(。= document('B.xml')/ Cakes / Cake [@ show ='true'])] < / p>

注意:我为翻译道歉。我会讲西班牙语。

答案 3 :(得分:1)

正确评估此情况的最简单的XPath表达式之一是:

not(document('B.xml')/*/Cake[@show !='true'] = /*/Cake)