我有一个XSL,我得到6个变量的值。 6个变量有一个整数值,比如3,4等。我需要检查所有6个变量是否具有相同的值。我怎样才能在XSL中实现这一目标? 我的XML是:
<records>
<A>
<Value> test </Value>
<Value> test </Value>
<Value> test </Value>
</A>
<B>
<Value> test </Value>
</B>
<C>
<Value> test </Value>
<Value> test </Value>
</C>
<D>
<Value> test </Value>
</D>
<E>
<Value> test </Value>
<Value> test </Value>
</E>
<F>
<Value> test </Value>
</F>
</records>
我的XSL看起来像:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:variable
name="noOfANodes"
select="count(/records/A/*)">
</xsl:variable>
<xsl:variable
name="noOfBNodes"
select="count(/records/B/*)">
</xsl:variable>
<xsl:variable
name="noOfCNodes"
select="count(/records/C/*)">
</xsl:variable>
<xsl:variable
name="noOfDNodes"
select="count(/records/D/*)">
</xsl:variable>
<xsl:variable
name="noOfENodes"
select="count(/records/E/*)">
</xsl:variable>
<xsl:variable
name="noOfFNodes"
select="count(/records/F/*)">
</xsl:variable>
<xsl:template match="/">
<xsl:choose>
<!-- The following is obv wrong. -->
<xsl:when test="$noOfANodes=$noOfBNodes=$noOfCNodes=$noOfDNodes">
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
答案 0 :(得分:2)
在xpath中,您将多个测试与关键字and
结合使用。
在您的情况下,您可以将测试重写为
<xsl:when test="$noOfANodes=$noOfBNodes and $noOfBNodes=$noOfCNodes and $noOfCNodes=$noOfDNodes and $noOfDNodes=$noOfENodes and $noOfENodes=$noOfFNodes">
<!-- Do something here -->
</xsl:when>
这里我们测试成对 - 测试第一个变量与第二个,然后测试第二个与第三个变量(我们不需要测试第一个与第三个,因为我们知道如果此测试为真,则为真),然后测试第三个与第四个,依此类推。
如果你可以使用XSLT2,这甚至可以简化为
<xsl:when test="every $m in ($noOfANodes,$noOfBNodes,$noOfCNodes,$noOfDNodes,$noOfENodes) satisfies ($m=$noOfFNodes)">
<!-- Do something here -->
</xsl:when>
我们构造除了最后一个之外的每个值的一系列,并且每个值都与最后一个相关。如果所有这些都等于最后一个,我们知道它们彼此都是相同的。
我们实际上可以在XSLT1案例中使用相同的逻辑,并针对最后一个测试每个变量。
答案 1 :(得分:1)
你应该使用这样的复杂条件:
<xsl:output method="xml" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:variable
name="noOfANodes"
select="count(/records/A/*)">
</xsl:variable>
<xsl:variable
name="noOfBNodes"
select="count(/records/B/*)">
</xsl:variable>
<xsl:variable
name="noOfCNodes"
select="count(/records/C/*)">
</xsl:variable>
<xsl:variable
name="noOfDNodes"
select="count(/records/D/*)">
</xsl:variable>
<xsl:variable
name="noOfENodes"
select="count(/records/E/*)">
</xsl:variable>
<xsl:variable
name="noOfFNodes"
select="count(/records/F/*)">
</xsl:variable>
<xsl:template match="/">
<xsl:choose>
<!-- The following can extend to any number of statements. -->
<xsl:when test="$noOfANodes=$noOfBNodes and $noOfANodes=$noOfCNodes and $noOfANodes=$noOfDNodes">
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
希望这会有所帮助......
答案 2 :(得分:1)
在XSLT 2.0中,您可以编写
count(distinct-values(($noOfANodes, $noOfBNodes, $noOfCNodes,
$noOfDNodes, $noOfENodes, $noOfFNodes))) = 1
更好的是,避免使用六个变量:
count(distinct-values(/records/*/count(Value))) = 1