2010-04-24 8 views
13

Tengo problemas con una plantilla que tiene que comprobar 3 nodos diferentes y si no están vacíos, imprimir los datospruebas XSL cadenas vacías con <xsl:if> y clasificar

que estoy usando <xsl:if test="string-length(node) != 0"> para cada nodo a continuación, haciendo la salida pero no está imprimiendo nada. Es como si la prueba devuelve cero.

He seleccionado el nodo primario de cada nodo. Quiero verificar la longitud cuando la plantilla coincide pero aún no funciona.

Otra cosa, ¿cómo puedo ordenar la lista usando <datefrom>. Intenté usar esto pero recibí un error al cargar la hoja de estilo. Si saco el tipo funciona

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

Y una sección de mi xml. Si necesita que edite mi publicación para que pueda ver el código completo, lo haré, pero el resto funciona bien.

<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

No ha proporcionado el código XSLT con el problema principal. En cuanto a '', solo puede ser un elemento secundario (¡inmediato!) De '' o ''. –

+0

Publicación editada para mostrar todo el código de la hoja de estilos XSL – AdRock

Respuesta

14

Puede ordenar los elementos cuando se aplica una plantilla:

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

También está confundiendo un poco su contexto nodo:

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

probablemente debería ser:

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

Ya que coinciden ing conaddress2 el nodo de contexto se establece en conaddress2. Si intenta utilizar string-length(conaddress2) desde este contexto, significa que está tratando de encontrar un nodo secundario conaddress2 del nodo de contexto actual (que es conaddress2). En otras palabras, está tratando de encontrar la longitud conaddress2\conaddress2.

Del mismo modo, en esta plantilla:

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

Se puede quitar el "/". desde sus expresiones de selección. Así que en lugar de:

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

Puede utilizar

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

(Aunque ambos trabajaban lo mismo en mi analizador XSLT.)

+0

Muchas gracias ... parece tan obvio ahora – AdRock

Cuestiones relacionadas