如何检查XSL中的多个变量是否具有相同的值?

时间:2016-03-11 09:48:46

标签: xml xslt

我有一个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>

3 个答案:

答案 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