我有一个xml,值可以是
<n1>value1</n1>
<n1>value1</n1>
<n1>value2</n1>
我需要检查所有这些值是否相同,如果相同,我需要将它分配给另一个元素。我正在使用XSLT v1.0。
谢谢,
答案 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>