2010-04-24 8 views
13

Mam problemy z szablonem, który musi sprawdzić 3 różnych węzłów, a jeśli nie są one puste, wydrukować danetestowania XSL puste struny z <xsl:if> i sortowania

używam <xsl:if test="string-length(node) != 0"> dla każdego węzła następnie robi wyjście ale nic nie drukuje. To tak, jakby test zwrócił zero.

Wybrałem węzeł nadrzędny każdego węzła Chcę sprawdzić długość jako dopasowanie do szablonu, ale nadal nie działa.

Kolejna rzecz, jak posortować listę przy użyciu <datefrom>. Próbowałem użyć tego, ale pojawia się błąd podczas ładowania arkusza stylów. Jeśli wykupię sortowanie, które działa:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:template name="hoo" match="/"> 
     <html> 
      <head> 
       <title>Registered Festival Organisers and Festivals</title> 
       <link rel="stylesheet" type="text/css" href="userfestival.css" /> 
      </head> 
      <body> 
       <h1>Registered Festival Organisers and Festivals</h1> 
       <h3>Ordered by the festival date ascending</h3>     
       <xsl:apply-templates select="folktask/member"/> 

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

<xsl:template match="folktask/member"> 
    <xsl:if test="user/account/userlevel='3'"> 
     <xsl:sort select="festival/event/datefrom"/> 
     <div class="userdiv"> 
      <xsl:apply-templates select="user"/>  
      <xsl:apply-templates select="festival"/>  
     </div> 
    </xsl:if> 
</xsl:template> 

    <xsl:template match="user"> 
     <xsl:apply-templates select="@id" mode="userid"/> 
     <xsl:apply-templates select="personal/name"/> 
     <xsl:apply-templates select="personal/address1"/> 
     <xsl:apply-templates select="personal/city"/> 
     <xsl:apply-templates select="personal/county"/> 
     <xsl:apply-templates select="personal/postcode"/> 
     <xsl:apply-templates select="personal/telephone"/> 
     <xsl:apply-templates select="personal/mobile"/> 
     <xsl:apply-templates select="personal/email"/> 
     <xsl:apply-templates select="personal"/> 
     <xsl:apply-templates select="account/username"/> 
     <xsl:apply-templates select="account"/> 
    </xsl:template> 

    <xsl:template match="festival"> 
     <xsl:apply-templates select="@id" mode="festid"/> 
     <xsl:apply-templates select="event/eventname"/> 
     <xsl:apply-templates select="event/url"/> 
     <xsl:apply-templates select="event/datefrom"/> 
     <xsl:apply-templates select="event/dateto"/> 
     <xsl:apply-templates select="event/location"/> 
     <xsl:apply-templates select="event/eventpostcode"/> 
     <xsl:apply-templates select="event/coords/lat"/> 
     <xsl:apply-templates select="event/coords/lng"/> 
     <xsl:apply-templates select="contact/conname"/> 
     <xsl:apply-templates select="contact/conaddress1"/> 
     <xsl:apply-templates select="contact/conaddress2"/> 
     <xsl:apply-templates select="contact/concity"/> 
     <xsl:apply-templates select="contact/concounty"/> 
     <xsl:apply-templates select="contact/conpostcode"/> 
     <xsl:apply-templates select="contact"/> 
     <xsl:apply-templates select="contact/conemail"/> 
    </xsl:template> 

    <xsl:template match="@id" mode="userid"> 
     <div class="heading bold"><h2>USER ID: <xsl:value-of select="." /></h2></div> 
    </xsl:template> 

    <xsl:template match="personal/name"> 
     <div class="small bold">NAME:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="personal/address1"> 
     <div class="small bold">ADDRESS:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="personal/city"> 
     <div class="small bold">CITY:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="personal/county"> 
     <div class="small bold">COUNTY:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="personal/postcode"> 
     <div class="small bold">POSTCODE:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="personal/telephone"> 
     <div class="small bold">TELEPHONE:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="personal/mobile"> 
     <div class="small bold">MOBILE:</div> 
     <div class="large"><xsl:value-of select="." /> 
     </div> 
    </xsl:template> 

    <xsl:template match="personal/email"> 
     <div class="small bold">EMAIL:</div> 
     <div class="large"> 
      <xsl:element name="a"> 
       <xsl:attribute name="href"> 
        <xsl:text>mailto:</xsl:text> 
        <xsl:value-of select="." /> 
       </xsl:attribute> 
       <xsl:value-of select="." /> 
      </xsl:element> 
     </div> 
    </xsl:template> 

    <xsl:template match="personal"> 
     <div class="small bold">SEX:</div> 
     <div class="colored bold"> 
      <xsl:choose> 
       <xsl:when test="sex='Male'"> 
        <div class="sex male"><xsl:value-of select="sex/."/></div> 
       </xsl:when> 
       <xsl:otherwise> 
        <div class="sex female"><xsl:value-of select="sex/."/></div> 
       </xsl:otherwise> 
      </xsl:choose> 
     </div> 
    </xsl:template> 

    <xsl:template match="account/username"> 
     <div class="small bold">USERNAME:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 


    <xsl:template match="account"> 
     <div class="small bold">ACCOUNT TYPE:</div> 
     <div class="colored "> 
      <xsl:choose> 
       <xsl:when test="userlevel='1'"> 
        <div class="nml bold">Normal User</div> 
       </xsl:when> 

       <xsl:when test="userlevel='2'"> 
        <div class="vol bold">Volunteer</div> 
       </xsl:when> 

       <xsl:when test="userlevel='3'"> 
        <div class="org bold">Organiser</div> 
       </xsl:when> 

       <xsl:otherwise> 
        <div class="name adm bold">Administrator</div> 
       </xsl:otherwise> 
      </xsl:choose> 
     </div> 
    </xsl:template> 

    <xsl:template match="@id" mode="festid"> 
     <div class="heading2 bold"><h2>FESTIVAL ID: <xsl:value-of select="." /></h2></div> 
    </xsl:template> 

    <xsl:template match="eventname"> 
     <div class="small bold">EVENT NAME:</div> 
     <div class="large bold"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="url"> 
     <div class="small bold">URL:</div> 
     <div class="large"> 
      <xsl:element name="a"> 
       <xsl:attribute name="href"> 
        <xsl:value-of select="." /> 
       </xsl:attribute> 
       <xsl:value-of select="." /> 
      </xsl:element> 
     </div> 
    </xsl:template> 

    <xsl:template match="datefrom"> 
     <div class="small bold">DATE FROM:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="dateto"> 
     <div class="small bold">DATE TO:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="location"> 
     <div class="small bold">LOCATION:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="eventpostcode"> 
     <div class="small bold">POSTCODE:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="coords/lat"> 
     <div class="small bold">LATITUDE:</div> 
     <div class="large"><xsl:value-of select="." /> 
     </div> 
    </xsl:template> 

    <xsl:template match="coords/lng"> 
     <div class="small bold">LONGITUDE:</div> 
     <div class="large"><xsl:value-of select="." /> 
     </div> 
    </xsl:template> 

    <xsl:template match="conname"> 
     <div class="small bold">NAME:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="conaddress1"> 
     <div class="small bold">ADDRESS:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="conaddress2"> 
     <xsl:if test="string-length(conaddress2)!=0"> 
      <div class="small bold"><xsl:text>&#160;</xsl:text></div> 
      <div class="large"> 
       <xsl:value-of select="." /> 
      </div> 
     </xsl:if> 
    </xsl:template> 

    <xsl:template match="concity"> 
     <div class="small bold">CITY:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="concounty"> 
     <div class="small bold">COUNTY:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="conpostcode"> 
     <div class="small bold">POSTCODE:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

<xsl:template match="contact"> 
    <xsl:if test="string-length(contelephone)!=0"> 
     <div class="small bold">TELEPHONE:</div> 
     <div class="large"> 
      <xsl:value-of select="contelephone/." /> 
     </div> 
    </xsl:if> 

    <xsl:if test="string-length(conmobile)!=0"> 
     <div class="small bold">MOBILE:</div> 
     <div class="large"> 
      <xsl:value-of select="conmobile/." /> 
     </div> 
    </xsl:if> 

    <xsl:if test="string-length(fax)!=0"> 
     <div class="small bold">FAX:</div> 
     <div class="large"> 
      <xsl:value-of select="fax/." /> 
     </div> 
    </xsl:if> 
</xsl:template> 

    <xsl:template match="conemail"> 
     <div class="small bold">EMAIL:</div> 
     <div class="large"> 
      <xsl:element name="a"> 
       <xsl:attribute name="href"> 
        <xsl:text>mailto:</xsl:text> 
        <xsl:value-of select="." /> 
       </xsl:attribute> 
       <xsl:value-of select="." /> 
      </xsl:element> 
     </div> 
    </xsl:template> 

</xsl:stylesheet> 

I część mojego xml. Jeśli potrzebujesz mnie do edycji mojego posta, to zobaczysz pełny kod, ale reszta działa poprawnie.

<folktask> 
<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>[email protected]</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> 
    <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>[email protected]</conemail> 
    </contact> 
    </festival> 
</member> 
</folktask> 
+0

Nie umieszczono kod XSLT z głównym problemem. Co do '', może to być tylko dziecko (natychmiast!) Z '' lub ''. –

+0

Edytowany post, aby wyświetlić cały kod arkusza stylów XSL – AdRock

Odpowiedz

14

można sortować elementy po zastosowaniu szablonu:

<xsl:apply-templates select="folktask/member"> 
    <xsl:sort select="festival/event/datefrom"/> 
</xsl:apply-templates> 

Ty też mylące swój kontekst węzła nieznacznie:

<xsl:template match="conaddress2"> 
    <xsl:if test="string-length(conaddress2)!=0"> 
    ... 
    </xsl:if> 
</xsl:template> 

prawdopodobnie powinien być:

<xsl:template match="conaddress2"> 
    <xsl:if test="string-length(.)!=0"> 
    ... 
    </xsl:if> 
</xsl:template> 

Ponieważ jesteś dopasowany ing conaddress2 węzeł kontekstu jest ustawiony na conaddress2. Jeśli spróbujesz użyć wartości string-length(conaddress2) z tego kontekstu, oznacza to, że próbujesz znaleźć węzeł podrzędny bieżącego kontekstu (conaddress2). Innymi słowy, próbujesz znaleźć długość conaddress2\conaddress2.

Podobnie w tym szablonie "/"

<xsl:template match="contact"> 
    <xsl:if test="string-length(contelephone)!=0"> 
    <div class="small bold">TELEPHONE:</div> 
    <div class="large"> 
     <xsl:value-of select="contelephone/." /> 
    </div> 
    </xsl:if> 

    <xsl:if test="string-length(conmobile)!=0"> 
    <div class="small bold">MOBILE:</div> 
    <div class="large"> 
     <xsl:value-of select="conmobile/." /> 
    </div> 
    </xsl:if> 

    <xsl:if test="string-length(fax)!=0"> 
    <div class="small bold">FAX:</div> 
    <div class="large"> 
     <xsl:value-of select="fax/." /> 
    </div> 
    </xsl:if> 
</xsl:template> 

można usunąć z wybranych wyrażeń. Więc zamiast:

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

Można użyć

<xsl:value-of select="contelephone" /> 

(Chociaż zarówno pracował tak samo w moim XSLT parsera.)

+0

Wielkie dzięki .... wydaje się teraz tak oczywiste – AdRock