2016-03-11 55 views
0

我有一個XSL,我得到6個變量的值。 6個變量有一個整數值,比如3,4等。我需要檢查所有6個變量是否具有相同的值。我如何在XSL中實現這一點? 我的XML是:如何檢查多個變量在XSL中是否具有相同的值?

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

回答

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的情況下使用這個相同的邏輯,並對每個變量進行最後的測試。

+0

XSLT 2是XSLT的一個單獨的版本?我如何使用它? – Chandeep

+0

@Chandeep你必須有一個XSLT2處理器。撒克遜是最廣泛使用的開源軟件之一。否則,只需要在樣式表上設置版本(您已將版本設置爲2.0)並理解兩個版本之間的差異即可。 XSLT2增加了一些功能,並且有一些功能的工作方式不同。 – Matthew

+0

謝謝!這有幫助 – Chandeep

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> 

希望這有助於...

1

在XSLT 2.0,你可以寫

count(distinct-values(($noOfANodes, $noOfBNodes, $noOfCNodes, 
$noOfDNodes, $noOfENodes, $noOfFNodes))) = 1 

更妙的是,避免使用六個變量:

count(distinct-values(/records/*/count(Value))) = 1 
相關問題