控制整个节点中的元素值是否相同

时间:2014-10-30 10:13:54

标签: xslt xslt-1.0

必须使用一个表达式来控制所有LIGHT_RANGE在所有SECTION_CONTENT_LIST_ITEM中都是相同的。

这是我的XML:

<SECTION_CONTENT_LIST_ITEM>  <------- First Group
    <NTC_LIGHTLISTPRODUCT>
        <IMMUTABLE_ID>5585</IMMUTABLE_ID>
        <LIGHT_INFORMATION_LIST>
            <LIGHT_INFORMATION>
                <LIGHT_COLOUR>G</LIGHT_COLOUR>  <-- LIGHT_COLOUR G
                <LIGHT_RANGE>3</LIGHT_RANGE>    <-- LIGHT_RANGE 3
            </LIGHT_INFORMATION>
            <LIGHT_INFORMATION>
                <LIGHT_COLOUR>R</LIGHT_COLOUR>  <-- LIGHT_COLOUR R
                <LIGHT_RANGE>3</LIGHT_RANGE>    <-- LIGHT_RANGE 3
            </LIGHT_INFORMATION>
        </LIGHT_INFORMATION_LIST>
    </NTC_LIGHTLISTPRODUCT>    
</SECTION_CONTENT_LIST_ITEM>
<SECTION_CONTENT_LIST_ITEM>  <------- Second Group
    <NTC_LIGHTLISTPRODUCT>
        <IMMUTABLE_ID>6000</IMMUTABLE_ID>
        <LIGHT_INFORMATION_LIST>
            <LIGHT_INFORMATION>
                <LIGHT_COLOUR>R</LIGHT_COLOUR>  <-- LIGHT_COLOUR R
                <LIGHT_RANGE>10</LIGHT_RANGE>    <-- LIGHT_RANGE 10
            </LIGHT_INFORMATION>
            <LIGHT_INFORMATION>
                <LIGHT_COLOUR>G</LIGHT_COLOUR>  <-- LIGHT_COLOUR G
                <LIGHT_RANGE>10</LIGHT_RANGE>    <-- LIGHT_RANGE 10
            </LIGHT_INFORMATION>
            <LIGHT_INFORMATION>
                <LIGHT_COLOUR>W</LIGHT_COLOUR>  <-- LIGHT_COLOUR W
                <LIGHT_RANGE>12</LIGHT_RANGE>    <-- LIGHT_RANGE 12
            </LIGHT_INFORMATION>
        </LIGHT_INFORMATION_LIST>
    </NTC_LIGHTLISTPRODUCT>    
</SECTION_CONTENT_LIST_ITEM>

我的XSLT:

<xsl:for-each select="LIGHT_INFORMATION_LIST/LIGHT_INFORMATION/LIGHT_RANGE[not(. = preceding::LIGHT_RANGE[preceding::IMMUTABLE_ID = $EF])]">

    <!-- Prendo le lettere dei colori in LIGHT_COLOUR-->
    <xsl:variable name="LCorrente" select="preceding-sibling::LIGHT_COLOUR"/>                                                                                                                           
    <xsl:variable name="LPrecedente" select="preceding::LIGHT_RANGE[1][not(contains(preceding-sibling::LIGHT_COLOUR, '-'))][preceding::IMMUTABLE_ID = $EF]/preceding-sibling::LIGHT_COLOUR"/>

    <!-- Prendo i numeri di portata in LIGHT_RANGE-->
    <xsl:variable name="NCorrente" select="number(.)"/>
    <xsl:variable name="NPrecedente" select="number(preceding::LIGHT_RANGE[1][not(contains(preceding-sibling::LIGHT_COLOUR, '-'))][preceding::IMMUTABLE_ID=$EF])"/>

    <xsl:value-of select="."/>
</xsl:for-each>

这是输出: 3(第一组)
10 12(第二组)&lt; ==需要另一个&#39; 10&#39;因为在leat元素是不同的。

请求:
必须有一个表达式来控制所有LIGHT_RANGE在所有SECTION_CONTENT_LIST_ITEM中都是相同的。 (第一个案例) 在第二种情况下,您可以看到有树元素,2是相同的1不同。在这种情况下,如果至少有一个s不同的写树元素。 (第二个案例)

**请求输出:**
3&lt; ==返回3,因为此SECTION_CONTENT_LIST_ITEM中的所有元素LIGHT_RANGE都相同。

10 10 12&lt; ==第二组

1 个答案:

答案 0 :(得分:2)

当所有LIGHT_RANGE值相同时,XSLT输出true,否则false

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/SECTION_CONTENT_LIST_ITEM">
    <xsl:value-of select="count(.//LIGHT_RANGE) = count(.//LIGHT_RANGE[. = (current()//LIGHT_RANGE)[1]])"/>
</xsl:template>
</xsl:stylesheet>