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

Aru*_*run 9 xslt

我有一个像xml,值可以

<n1>value1</n1>
<n1>value1</n1>
<n1>value2</n1>
Run Code Online (Sandbox Code Playgroud)

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

谢谢,

Dim*_*hev 14

好问题,+ 1.

只需使用:

not(/*/n1[1] != /*/n1)
Run Code Online (Sandbox Code Playgroud)

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

not($v[1] != $v)
Run Code Online (Sandbox Code Playgroud)

说明1:

根据定义:

/*/n1[1] != /*/n1
Run Code Online (Sandbox Code Playgroud)

true()恰好如果存在中的一个节点/*/n1,其字符串值不等于的字符串值/*/n1[1]

对此的逻辑否定:

not(/*/n1[1] != /*/n1)
Run Code Online (Sandbox Code Playgroud)

true()当且仅当没有节点/*/n1,其字符串值不等于字符串值存在/*/n1[1] -也就是说,如果在所有节点/*/n1具有相同的刺痛值.

说明2:

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

every x has property y
Run Code Online (Sandbox Code Playgroud)

相当于:

There is no x that doesn't have property y
Run Code Online (Sandbox Code Playgroud)


Way*_*ett 1

假设有一个这种形式的文档:

<root>
    <n1>value1</n1>
    <n1>value1</n1>
    <n1>value1</n1>
</root>
Run Code Online (Sandbox Code Playgroud)

以下简单的样式表确定每个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>
Run Code Online (Sandbox Code Playgroud)

输出:

All same? true
Run Code Online (Sandbox Code Playgroud)

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

count(/*/n1[.=/*/n1[1]])=count(/*/n1))
Run Code Online (Sandbox Code Playgroud)

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

n1首先将所有内容选择到名为 的变量中,可以使阅读变得更容易一些n

count($n[.=$n[1]])=count($n)
Run Code Online (Sandbox Code Playgroud)

根据结果​​有条件地执行一些操作,如下所示:

<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>
Run Code Online (Sandbox Code Playgroud)