Как сгруппировать использование XSLT

Я испытываю затруднения при группировке ряда узлов.

Я нашел статью, которая действительно работает с группировкой, и я протестировал ее, и она работает над маленькой тестовой таблицей стилей, которую я имею

Я теперь должен использовать его в своей таблице стилей, где я только хочу выбрать наборы узлов, которые имеют определенное значение.

То, что я хочу сделать в своей таблице стилей, является выбором все пользователи, у которых есть userlevel 2 затем для группировки их волонтерским регионом.

То, что происходит в минуту, - то, что это получает правильное количество пользователей с userlevel 2, но не печатает их. Это просто повторяет первого пользователя в XML-файле.

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:key name="volunteers-by-region" match="volunteer" use="region" />

    <xsl:template name="hoo" match="/">
        <html>
            <head>
                <title>Registered Volunteers</title>
                <link rel="stylesheet" type="text/css" href="volunteer.css" />
            </head>
            <body>
                <h1>Registered Volunteers</h1>
                <h3>Ordered by the username ascending</h3>  

                <xsl:for-each select="folktask/member[user/account/userlevel='2']">

                    <xsl:for-each select="volunteer[count(. | key('volunteers-by-region', region)[1]) = 1]">
                        <xsl:sort select="region" />

                        <xsl:for-each select="key('volunteers-by-region', region)">
                            <xsl:sort select="folktask/member/user/personal/name" />

                            <div class="userdiv">

                                <xsl:call-template name="member_userid">
                                    <xsl:with-param name="myid" select="/folktask/member/user/@id" />
                                </xsl:call-template>

                                <xsl:call-template name="volunteer_volid">
                                    <xsl:with-param name="volid" select="/folktask/member/volunteer/@id" />
                                </xsl:call-template>

                                <xsl:call-template name="volunteer_role">
                                    <xsl:with-param name="volrole" select="/folktask/member/volunteer/roles" />
                                </xsl:call-template>

                                <xsl:call-template name="volunteer_region">
                                    <xsl:with-param name="volloc" select="/folktask/member/volunteer/region" />
                                </xsl:call-template>

                            </div>
                        </xsl:for-each>
                    </xsl:for-each>
                </xsl:for-each>
                <xsl:if test="position()=last()">
                    <div class="count"><h2>Total number of volunteers: <xsl:value-of select="count(/folktask/member/user/account/userlevel[text()=2])"/></h2></div>
                </xsl:if>
            </body>
        </html>
    </xsl:template>

    <xsl:template name="member_userid">
        <xsl:param name="myid" select="'Not Available'" />
        <div class="heading bold"><h2>USER ID: <xsl:value-of select="$myid" /></h2></div>
    </xsl:template>

    <xsl:template name="volunteer_volid">
        <xsl:param name="volid" select="'Not Available'" />
        <div class="heading2 bold"><h2>VOLUNTEER ID: <xsl:value-of select="$volid" /></h2></div>
    </xsl:template>

    <xsl:template name="volunteer_role">
        <xsl:param name="volrole" select="'Not Available'" />

        <div class="small bold">ROLES:</div>
        <div class="large">
            <xsl:choose>
                <xsl:when test="string-length($volrole)!=0">
                    <xsl:value-of select="$volrole" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:text> </xsl:text>
                </xsl:otherwise>
            </xsl:choose>
        </div>
    </xsl:template>

    <xsl:template name="volunteer_region">
        <xsl:param name="volloc" select="'Not Available'" />
        <div class="small bold">REGION:</div>
        <div class="large"><xsl:value-of select="$volloc" /></div>
    </xsl:template>

</xsl:stylesheet> 

вот мой полный XML-файл

<?xml version="1.0" encoding="ISO-8859-1" ?>
<?xml-stylesheet type="text/xsl" href="volunteers.xsl"?>
<folktask xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="folktask.xsd">
    <member>
        <user id="1">
            <personal>
                <name>Abbie Hunt</name>
                <sex>Female</sex>
                <address1>108 Access Road</address1>
                <address2></address2>
                <city>Wells</city>
                <county>Somerset</county>
                <postcode>BA5 8GH</postcode>
                <telephone>01528927616</telephone>
                <mobile>07085252492</mobile>
                <email>adrock@gmail.com</email>
            </personal>
            <account>
                <username>AdRock</username>
                <password>269eb625e2f0cf6fae9a29434c12a89f</password>
                <userlevel>4</userlevel>
                <signupdate>2010-03-26T09:23:50</signupdate>
            </account>
        </user>
        <volunteer id="1">
            <roles></roles>
            <region>South West</region>
        </volunteer>
    </member>
    <member>
        <user id="2">
            <personal>
                <name>Aidan Harris</name>
                <sex>Male</sex>
                <address1>103 Aiken Street</address1>
                <address2></address2>
                <city>Chichester</city>
                <county>Sussex</county>
                <postcode>PO19 4DS</postcode>
                <telephone>01905149894</telephone>
                <mobile>07784467941</mobile>
                <email>ambientexpert@yahoo.co.uk</email>
            </personal>
            <account>
                <username>AmbientExpert</username>
                <password>8e64214160e9dd14ae2a6d9f700004a6</password>
                <userlevel>2</userlevel>
                <signupdate>2010-03-26T09:23:50</signupdate>
            </account>
        </user>
        <volunteer id="2">
            <roles>Van Driver,gas Fitter</roles>
            <region>South Central</region>
        </volunteer>
    </member>
    <member>
        <user id="3">
            <personal>
                <name>Skye Saunders</name>
                <sex>Female</sex>
                <address1>31 Anns Court</address1>
                <address2></address2>
                <city>Cirencester</city>
                <county>Gloucestershire</county>
                <postcode>GL7 1JG</postcode>
                <telephone>01958303514</telephone>
                <mobile>07260491667</mobile>
                <email>bigundecided@hotmail.co.uk</email>
            </personal>
            <account>
                <username>BigUndecided</username>
                <password>ea297847f80e046ca24a8621f4068594</password>
                <userlevel>2</userlevel>
                <signupdate>2010-03-26T09:23:50</signupdate>
            </account>
        </user>
        <volunteer id="3">
            <roles>Scaffold Erector</roles>
            <region>South West</region>
        </volunteer>
    </member>
    <member>
        <user id="4">
            <personal>
                <name>Connor Lawson</name>
                <sex>Male</sex>
                <address1>12 Ash Way</address1>
                <address2></address2>
                <city>Swindon</city>
                <county>Wiltshire</county>
                <postcode>SN3  6GS</postcode>
                <telephone>01791928119</telephone>
                <mobile>07338695664</mobile>
                <email>itunestinker@fsmail.co.uk</email>
            </personal>
            <account>
                <username>iTuneStinker</username>
                <password>3a1f5fda21a07bfff20c41272bae7192</password>
                <userlevel>3</userlevel>
                <signupdate>2010-03-26T09:23:50</signupdate>
            </account>
        </user>
        <festival id="1">
            <event>
                <eventname>Oxford Folk Festival</eventname>
                <url>http://www.oxfordfolkfestival.com/</url>
                <datefrom>2010-04-07</datefrom>
                <dateto>2010-04-09</dateto>
                <location>Oxford</location>
                <eventpostcode>OX1 9BE</eventpostcode>
                <additional>Oxford Folk Festival is going into it's third year in 2006. As well as needing volunteers to steward for the event on the weekend itself, we would be delighted to hear from people willing to help in year round festival work such as stuffing envelopes for mailings, poster and leaflet distribution, and stewarding duties at festival pre-events.</additional>
                <coords>
                    <lat>51.735640</lat>
                    <lng>-1.276136</lng>
                </coords>
            </event>
            <contact>
                <conname>Stuart Vincent</conname>
                <conaddress1>P.O. Box 642</conaddress1>
                <conaddress2></conaddress2>
                <concity>Oxford</concity>
                <concounty>Bedfordshire</concounty>
                <conpostcode>OX1 3BY</conpostcode>
                <contelephone>01865 79073</contelephone>
                <conmobile></conmobile>
                <fax></fax>
                <conemail>stewards@oxfordfolkfestival.com</conemail>
            </contact>
        </festival>
    </member>
    <member>
        <user id="5">
            <personal>
                <name>Lewis King</name>
                <sex>Male</sex>
                <address1>67 Arbors Way</address1>
                <address2></address2>
                <city>Sherborne</city>
                <county>Dorset</county>
                <postcode>DT9 0GS</postcode>
                <telephone>01446139701</telephone>
                <mobile>07292614033</mobile>
                <email>runninglife@btinternet.com</email>
            </personal>
            <account>
                <username>Runninglife</username>
                <password>98fab0a27c34ddb2b0618bc184d4331d</password>
                <userlevel>2</userlevel>
                <signupdate>2010-03-26T09:23:50</signupdate>
            </account>
        </user>
        <volunteer id="4">
            <roles>Van Driver</roles>
            <region>South West</region>
        </volunteer>
    </member>
    <member>
        <user id="6">
            <personal>
                <name>Cameron Lee</name>
                <sex>Male</sex>
                <address1>77 Arrington Road</address1>
                <address2></address2>
                <city>Solihull</city>
                <county>Warwickshire</county>
                <postcode>B90  6FG</postcode>
                <telephone>01435158624</telephone>
                <mobile>07789503179</mobile>
                <email>love2mixer@hotmail.co.uk</email>
            </personal>
            <account>
                <username>love2Mixer</username>
                <password>1df752d54876928639cea07ce036a9c0</password>
                <userlevel>2</userlevel>
                <signupdate>2010-03-26T09:23:50</signupdate>
            </account>
        </user>
        <volunteer id="5">
            <roles>Fire Warden</roles>
            <region>Midlands</region>
        </volunteer>
    </member>
    <member>
        <user id="7">
            <personal>
                <name>Lexie Dean</name>
                <sex>Female</sex>
                <address1>38 Bloomfield Court</address1>
                <address2></address2>
                <city>Windermere</city>
                <county>Westmorland</county>
                <postcode>LA23 8BM</postcode>
                <telephone>01781207188</telephone>
                <mobile>07127461231</mobile>
                <email>mailnetworker@hotmail.co.uk</email>
            </personal>
            <account>
                <username>MailNetworker</username>
                <password>0e070701839e612bf46af4421db4f44b</password>
                <userlevel>3</userlevel>
                <signupdate>2010-03-26T09:23:50</signupdate>
            </account>
        </user>
        <festival id="2">
            <event>
                <eventname>Middlewich Folk And Boat Festival</eventname>
                <url>http://midfest.org.uk/mfab/</url>
                <datefrom>2010-06-16</datefrom>
                <dateto>2010-06-18</dateto>
                <location>Middlewich</location>
                <eventpostcode>CW10 9BX</eventpostcode>
                <additional>We welcome stewards staying on campsite or boats.</additional>
                <coords>
                    <lat>53.190562</lat>
                    <lng>-2.444926</lng>
                </coords>
            </event>
            <contact>
                <conname>Festival Committee</conname>
                <conaddress1>PO Box 141</conaddress1>
                <conaddress2></conaddress2>
                <concity>Winsford</concity>
                <concounty>Cheshire</concounty>
                <conpostcode>CW10 9WB</conpostcode>
                <contelephone>07092 39050</contelephone>
                <conmobile>07092 39050</conmobile>
                <fax></fax>
                <conemail>midfest@hotmail.com</conemail>
            </contact>
        </festival>
    </member>
    <member>
        <user id="8">
            <personal>
                <name>Liam Chapman</name>
                <sex>Male</sex>
                <address1>99 Black Water Drive</address1>
                <address2></address2>
                <city>St.Austell</city>
                <county>Cornwall</county>
                <postcode>PL25 3GF</postcode>
                <telephone>01835629418</telephone>
                <mobile>07695179069</mobile>
                <email>greenwimp@aol.com</email>
            </personal>
            <account>
                <username>GreenWimp</username>
                <password>1fe3df99a841dc4f723d21af89e0990f</password>
                <userlevel>1</userlevel>
                <signupdate>2010-03-26T09:23:50</signupdate>
            </account>
        </user>
    </member>
    <member>
        <user id="9">
            <personal>
                <name>Brandon Harrison</name>
                <sex>Male</sex>
                <address1>41 Arlington Way</address1>
                <address2></address2>
                <city>Dorchester</city>
                <county>Dorset</county>
                <postcode>DT1 3JS</postcode>
                <telephone>01293626735</telephone>
                <mobile>07277145760</mobile>
                <email>lovelystar@gmail.com</email>
            </personal>
            <account>
                <username>LovelyStar</username>
                <password>8b53b66f323aa5e6a083edb4fd44456b</password>
                <userlevel>1</userlevel>
                <signupdate>2010-03-26T09:23:50</signupdate>
            </account>
        </user>
    </member>
    <member>
        <user id="10">
            <personal>
                <name>Samuel Young</name>
                <sex>Male</sex>
                <address1>102 Bailey Hill Road</address1>
                <address2></address2>
                <city>Wolverhampton</city>
                <county>Staffordshire</county>
                <postcode>WV7 8HS</postcode>
                <telephone>01594531382</telephone>
                <mobile>07544663654</mobile>
                <email>gurusassy@fsmail.co.uk</email>
            </personal>
            <account>
                <username>GuruSassy</username>
                <password>00da02da6c143c3d136bf60b8bfcf43e</password>
                <userlevel>2</userlevel>
                <signupdate>2010-03-26T09:23:50</signupdate>
            </account>
        </user>
        <volunteer id="6">
            <roles>Fire Warden</roles>
            <region>Midlands</region>
        </volunteer>
    </member>
    <member>
        <user id="11">
            <personal>
                <name>Alexander Harris</name>
                <sex>Male</sex>
                <address1>93 Beguine Drive</address1>
                <address2></address2>
                <city>Winchester</city>
                <county>Hampshire</county>
                <postcode>S23 2FD</postcode>
                <telephone>01452496582</telephone>
                <mobile>07353867291</mobile>
                <email>guitarexpert@yahoo.co.uk</email>
            </personal>
            <account>
                <username>GuitarExpert</username>
                <password>0102ad3740028e155925e9918ead3bde</password>
                <userlevel>2</userlevel>
                <signupdate>2010-03-26T09:23:50</signupdate>
            </account>
        </user>
        <volunteer id="7">
            <roles>Scaffold Erector</roles>
            <region>North East</region>
        </volunteer>
    </member>
    <member>
        <user id="12">
            <personal>
                <name>Tyler Mcdonald</name>
                <sex>Male</sex>
                <address1>44 Baker Road</address1>
                <address2></address2>
                <city>Bromley</city>
                <county>Kent</county>
                <postcode>BR1 2GD</postcode>
                <telephone>01918704546</telephone>
                <mobile>07314062451</mobile>
                <email>wildwish@yahoo.co.uk</email>
            </personal>
            <account>
                <username>WildWish</username>
                <password>073220bb5e9a12ad202bb7d94dcc86f7</password>
                <userlevel>1</userlevel>
                <signupdate>2010-03-26T09:23:50</signupdate>
            </account>
        </user>
    </member>
    <member>
        <user id="13">
            <personal>
                <name>Skye Mason</name>
                <sex>Female</sex>
                <address1>56 Cedar Creek Church Road</address1>
                <address2></address2>
                <city>Bracknell</city>
                <county>Berkshire</county>
                <postcode>RG12 1AQ</postcode>
                <telephone>01787607618</telephone>
                <mobile>07540218868</mobile>
                <email>pizzadork@gmx.co.uk</email>
            </personal>
            <account>
                <username>PizzaDork</username>
                <password>74c54937ee7051ee7f4ebc11296ed531</password>
                <userlevel>1</userlevel>
                <signupdate>2010-03-26T09:23:50</signupdate>
            </account>
        </user>
    </member>
    <member>
        <user id="14">
            <personal>
                <name>Maryam Rose</name>
                <sex>Female</sex>
                <address1>98 Baptist Circle</address1>
                <address2></address2>
                <city>Newbury</city>
                <county>Berkshire</county>
                <postcode>RG14 8DF</postcode>
                <telephone>01691317999</telephone>
                <mobile>07212477154</mobile>
                <email>sextech@btinternet.com</email>
            </personal>
            <account>
                <username>SexTech</username>
                <password>f1c21f9f1e999da97d7dc460bb876fcf</password>
                <userlevel>3</userlevel>
                <signupdate>2010-03-26T09:23:50</signupdate>
            </account>
        </user>
        <festival id="3">
            <event>
                <eventname>Birdsedge Village Festival</eventname>
                <url>http://www.birdsedge.co.uk/</url>
                <datefrom>2010-07-08</datefrom>
                <dateto>2010-07-09</dateto>
                <location>Birdsedge</location>
                <eventpostcode>HD8 8XT</eventpostcode>
                <additional></additional>
                <coords>
                    <lat>53.565644</lat>
                    <lng>-1.696196</lng>
                </coords>
            </event>
            <contact>
                <conname>Jacey Bedford</conname>
                <conaddress1>Penistone Road</conaddress1>
                <conaddress2>Birdsedge</conaddress2>
                <concity>Huddersfield</concity>
                <concounty>West Yorkshire</concounty>
                <conpostcode>HD8 8XT</conpostcode>
                <contelephone>01484 60623</contelephone>
                <conmobile></conmobile>
                <fax></fax>
                <conemail>jacey@artisan-harmony.com</conemail>
            </contact>
        </festival>
    </member>
    <member>
        <user id="15">
            <personal>
                <name>Lexie Rogers</name>
                <sex>Female</sex>
                <address1>38 Bishop Road</address1>
                <address2></address2>
                <city>Matlock</city>
                <county>Derbyshire</county>
                <postcode>DE4 1BX</postcode>
                <telephone>01961168823</telephone>
                <mobile>07170855351</mobile>
                <email>shipburglar@fsmail.co.uk</email>
            </personal>
            <account>
                <username>ShipBurglar</username>
                <password>cc190488a95667cb117e20bc6c7c330e</password>
                <userlevel>2</userlevel>
                <signupdate>2010-03-26T09:23:50</signupdate>
            </account>
        </user>
        <volunteer id="8">
            <roles>Gas Fitter</roles>
            <region>Midlands</region>
        </volunteer>
    </member>
    <member>
        <user id="16">
            <personal>
                <name>Noah Parker</name>
                <sex>Male</sex>
                <address1>112 Canty Road</address1>
                <address2></address2>
                <city>Keswick</city>
                <county>Cumberland</county>
                <postcode>CA12 4TR</postcode>
                <telephone>01931272522</telephone>
                <mobile>07610026576</mobile>
                <email>awsomemoon@fsmail.co.uk</email>
            </personal>
            <account>
                <username>AwsomeMoon</username>
                <password>50b770539bdf08543f15778fc7a6f188</password>
                <userlevel>2</userlevel>
                <signupdate>2010-03-26T09:23:50</signupdate>
            </account>
        </user>
        <volunteer id="9">
            <roles>Van Driver</roles>
            <region>North West</region>
        </volunteer>
    </member>
    <member>
        <user id="17">
            <personal>
                <name>Elliot Mitchell</name>
                <sex>Male</sex>
                <address1>102 Brown Loop</address1>
                <address2></address2>
                <city>Grimsby</city>
                <county>Lincolnshire</county>
                <postcode>OX16 4QP</postcode>
                <telephone>01212971319</telephone>
                <mobile>07544663654</mobile>
                <email>msbasher@gmail.com</email>
            </personal>
            <account>
                <username>msBasher</username>
                <password>c38fad85badcdff6e3559ef38656305d</password>
                <userlevel>1</userlevel>
                <signupdate>2010-03-26T09:23:50</signupdate>
            </account>
        </user>
    </member>
    <member>
        <user id="18">
            <personal>
                <name>Scarlett Rose</name>
                <sex>Female</sex>
                <address1>93 Cedar Lane</address1>
                <address2></address2>
                <city>Stourbridge</city>
                <county>Warminster</county>
                <postcode>DY8 4NX</postcode>
                <telephone>01537477435</telephone>
                <mobile>07353867291</mobile>
                <email>makeupwimp@aol.com</email>
            </personal>
            <account>
                <username>MakeupWimp</username>
                <password>16a9b7910fc34304c1d1a6a1b0c31502</password>
                <userlevel>1</userlevel>
                <signupdate>2010-03-26T09:23:50</signupdate>
            </account>
        </user>
    </member>
    <member>
        <user id="19">
            <personal>
                <name>Katie Butler</name>
                <sex>Female</sex>
                <address1>44 Boulder Crest Road</address1>
                <address2></address2>
                <city>Bungay</city>
                <county>Suffolk</county>
                <postcode>NR35 1LT</postcode>
                <telephone>01419124094</telephone>
                <mobile>07314062451</mobile>
                <email>tomatocrunch@aol.com</email>
            </personal>
            <account>
                <username>TomatoCrunch</username>
                <password>d7eba53443ec4ddcee69ed71b2023fc0</password>
                <userlevel>1</userlevel>
                <signupdate>2010-03-26T09:23:50</signupdate>
            </account>
        </user>
    </member>
    <member>
        <user id="20">
            <personal>
                <name>Jayden Richards</name>
                <sex>Male</sex>
                <address1>56 Corson Trail</address1>
                <address2></address2>
                <city>Sandy</city>
                <county>Bedfordshire</county>
                <postcode>SG19 6DF</postcode>
                <telephone>01882134438</telephone>
                <mobile>07540218868</mobile>
                <email>nightmaretwig@btinternet.com</email>
            </personal>
            <account>
                <username>nightmareTwig</username>
                <password>8a9c08c7b6473493e8a5da15dd541025</password>
                <userlevel>3</userlevel>
                <signupdate>2010-03-26T09:23:50</signupdate>
            </account>
        </user>
        <festival id="4">
            <event>
                <eventname>East Barnet Festival</eventname>
                <url>http://www.eastbarnetfestival.org.uk</url>
                <datefrom>2010-07-01</datefrom>
                <dateto>2010-07-03</dateto>
                <location>East Barnet</location>
                <eventpostcode>EN4 8TB</eventpostcode>
                <additional></additional>
                <coords>
                    <lat>51.641556</lat>
                    <lng>-0.163018</lng>
                </coords>
            </event>
            <contact>
                <conname>East Barnet Festival Commitee</conname>
                <conaddress1>Oak Hill Park</conaddress1>
                <conaddress2>Church Hill Road</conaddress2>
                <concity>East Barnet</concity>
                <concounty>Hertfordshire</concounty>
                <conpostcode>EN4 8TB</conpostcode>
                <contelephone>07071781745</contelephone>
                <conmobile>07071781745</conmobile>
                <fax></fax>
                <conemail>eastbarnetfestival@btinternet.com</conemail>
            </contact>
        </festival>
    </member>
    <member>
        <user id="21">
            <personal>
                <name>Abbie Jackson</name>
                <sex>Female</sex>
                <address1>98 Briarwood Lane</address1>
                <address2></address2>
                <city>Weymouth</city>
                <county>Dorset</county>
                <postcode>DT3 6TS</postcode>
                <telephone>01575629969</telephone>
                <mobile>07212477154</mobile>
                <email>crazyblockhead@gmx.co.uk</email>
            </personal>
            <account>
                <username>CrazyBlockhead</username>
                <password>4ce56fb13d043be605037ace4fbd9fa5</password>
                <userlevel>2</u
1
задан ekad 3 April 2017 в 12:59
поделиться

1 ответ

Вы правильно использовали выражения относительного пути внутри элементов for-each, но при передаче параметров вы неправильно переключились на абсолютные пути. Так что вместо, например,

<xsl:with-param name="myid" select="/folktask/member/user/@id" />

Я думаю, вы хотите, например,

<xsl:with-param name="myid" select="../user/@id" />

И, конечно же, вместо всех названных шаблонов и громоздкого call-template / with-param вы можете (и должны, на мой взгляд) просто написать соответствующие шаблоны и использовать apply-templates.

2
ответ дан 3 September 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: