我有一个像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)
假设有一个这种形式的文档:
<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元素的值的元素的计数与所有元素的计数进行比较n1。n1仅当每个节点具有相同的值时,这些计数才会相等。
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)