我有一个像这样的xml,值可以是
<n1>value1</n1>
<n1>value1</n1>
<n1>value2</n1>我需要检查所有这些值是否都相同,如果相同,则需要将其分配给另一个元素。我使用的是XSLT v1.0。
谢谢,
发布于 2011-12-15 04:45:37
问得好,+1。
只需使用
not(/*/n1[1] != /*/n1)假设在一个名为$v的变量中选择了所有的n1元素,这可以用14个字符的XPath表达式来表示
not($v[1] != $v)说明1
根据定义:
/*/n1[1] != /*/n1如果/*/n1中存在其字符串值不等于/*/n1[1]的字符串值的节点,则恰好为true()
这一点的逻辑否定:
not(/*/n1[1] != /*/n1)is true()当且仅当/*/n1中没有任何节点的字符串值不等于/*/n1[1]的字符串值--也就是说,如果/*/n1中的所有节点都具有相同的String值。
说明2
这遵循了一个更普遍的双重否定法则:
every x has property y等同于:
There is no x that doesn't have property y发布于 2011-12-15 03:54:33
假设有这样一份文档:
<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))...which将其值等于第一个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>https://stackoverflow.com/questions/8508852
复制相似问题