检查元素中的所有值是相同的

时间:2011-12-14 17:22:02

标签: xslt

我有一个xml,值可以是

<n1>value1</n1>
<n1>value1</n1>
<n1>value2</n1>

我需要检查所有这些值是否相同,如果相同,我需要将它分配给另一个元素。我正在使用XSLT v1.0。

谢谢,

2 个答案:

答案 0 :(得分:12)

好问题,+ 1。

只需使用

not(/*/n1[1] != /*/n1)

假设在名为n1的变量中选择了所有$v元素,这可以用14个字符长的XPath表达式来表示

not($v[1] != $v)

解释1

根据定义:

/*/n1[1] != /*/n1
如果true()中的节点的字符串值不等于/*/n1

的字符串值,那么

就是/*/n1[1]

对此的逻辑否定:

not(/*/n1[1] != /*/n1)

true() iff 没有节点/*/n1中存在其字符串值不等于/*/n1[1]的字符串值 - 也就是说,如果全部/*/n1中的节点具有相同的刺激值。

解释2

这是一个更普遍的双重否定法

every x has property y

相当于:

There is no x that doesn't have property y

答案 1 :(得分:0)

假设此表格的文件:

<root>
    <n1>value1</n1>
    <n1>value1</n1>
    <n1>value1</n1>
</root>

以下简单样式表确定每个n1元素是否具有相同的值:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" omit-xml-declaration="yes"/>
    <xsl:template match="/">
        <xsl:value-of select="
            concat('All same? ', count(/*/n1[.=/*/n1[1]])=count(/*/n1))"/>
    </xsl:template>
</xsl:stylesheet>

输出:

All same? true

此样式表的关键是表达式:

count(/*/n1[.=/*/n1[1]])=count(/*/n1))

...比较其值等于第一个n1元素的值的n1元素的计数与所有n1个元素的计数。仅当每个n1节点具有相同值时,这些计数才相等。

首先在名为n1的变量中选择所有n,这可以更容易阅读:

count($n[.=$n[1]])=count($n)

根据以下结果有条件地执行某些操作:

<xsl:template match="/">
    <xsl:variable name="all" select="count(/*/n1[.=/*/n1[1]])=count(/*/n1)"/>
    <xsl:if test="$all">All same</xsl:if>
    <xsl:if test="not($all)">Not all same</xsl:if>
</xsl:template>