3つの異なるノードをチェックする必要があるテンプレートで問題が発生し、それらが空でない場合は、データを印刷します
各ノードに<xsl:if test="string-length(node) != 0">
を使用して出力を実行していますが、何も出力されていません。テストがゼロを返すようなものです。
テンプレートが一致するため、長さを確認したい各ノードの親ノードを選択しましたが、それでも機能しません。
もう1つ、<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> </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>
テンプレートを適用すると、要素を並べ替えることができます。
_<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パーサーでは両方とも同じように機能しましたが。)