2010-04-24 91 views
13

我有有檢查3個不同的節點,如果他們不爲空,打印我使用<xsl:if test="string-length(node) != 0">每個節點然後做輸出數據XSL測試與<xsl:if>空字符串和排序

模板麻煩但它不打印任何東西。這就像測試返回零。

我已經選擇了每個節點的父節點,我想檢查模板匹配的長度,但它仍然不起作用。

另一件事,我如何使用<datefrom>對列表進行排序。我試過使用這個,但我得到一個關於加載樣式表的錯誤。如果我拿出它的工作方式

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

而我的一部分xml。如果您需要我編輯我的帖子,以便您可以看到完整的代碼,但其餘的可以正常工作。

<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

您還沒有與主要問題,提供的XSLT代碼。至於'',它只能是''或''的子(立即!)。 – 2010-04-24 18:55:11

+0

編輯後顯示XSL樣式表的整個代碼 – AdRock 2010-04-24 19:41:28

回答

14

你可以當你申請一個模板元素進行排序:

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

你也稍微有一些混亂的節點上下文:

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

也許應該是:

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

既然你匹配在conaddress2上下文節點被設置爲conaddress2。如果您嘗試在此上下文中使用string-length(conaddress2),則表示您正在嘗試查找當前上下文節點(即conaddress2)的conaddress2子節點。換句話說,你試圖找到conaddress2\conaddress2的長度。

同樣在這個模板:

<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:value-of select="contelephone/." /> 

您可以使用

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

(雖然兩者在我的XSLT解析器的工作是相同的。)

+0

非常感謝....現在看起來如此明顯 – AdRock 2010-04-25 08:50:16