我正在制作一个包含三个页面的基本联系人列表Web应用程序 - 一个显示数据库中所有联系人的联系人列表页面(存储在XML文件中),一个联系人视图页面(这是一个显示的只读页面)联系信息)和新的联系页面(允许您建立新联系人或编辑以前存在的联系人的信息)。
我的问题在于“联系视图”页面。每个联系人都有一个ID,这个ID通过URL传递(即contactViewer?id = mk)。使用这个ID,我希望使用一个简单的xsl for-each检查URL请求(保存在xsl变量中)以选择要显示的DB中的哪个联系人可以工作。不幸的是,在添加“for-each”后,页面上没有显示任何内容,我无法弄清楚它出错的地方。
这是ContactView的XSL页面。
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="url"/>
<xsl:variable name="currentID" select="substring-after($url, 'id=')"/>
<xsl:template match="/">
<html>
<head>
<title>Contact Database - Contact Viewer</title>
<style>
h1 {color:white; background-color:black; border-style:solid;
border-color: #981b1e; padding-left:10px; font-weight:bold;}
</style>
</head>
<body>
<h1>Contact Viewer</h1>
<xsl:value-of select="$currentID"/>
<xsl:for-each select="contactdatabase/contact/id[$currentID]">
<table cellspacing="5" border="3">
<tr height="60">
<td width="70px">
<xsl:value-of select="contactdatabase/contact/firstName"/>
</td>
<td width="100px">
<xsl:value-of select= "contactdatabase/contact/lastName"/>
</td>
<td width="120px">
<xsl:value-of select="contactdatabase/contact/firstName"/>
</td>
<td width="90px">
<xsl:value-of select="contactdatabase/contact/firstName"/>
</td>
<td width="35px">
<xsl:value-of select="contactdatabase/contact/state"/>
</td>
<td width="44px">
<xsl:value-of select="contactdatabase/contact/zipcode"/>
</td>
<td width="60px">
<xsl:value-of select="contactdatabase/contact/country"/>
</td>
<td width="80">
<xsl:value-of select="contactdatabase/contact/email"/> <br></br>
<xsl:value-of select="contactdatabase/contact/home"/> <br></br>
<xsl:value-of select="contactdatabase/contact/mail"/>
</td>
<td width="80">
<xsl:value-of select="contactdatabase/contact/phonenum"/>
</td>
<td width="180">
<xsl:value-of select="contactdatabase/contact/emailaddress"/>
</td>
<td width="120px">
<a href="contactViewer?contactid={id}">view</a> / edit / delete
</td>
</tr>
</table>
</xsl:for-each>
<a href="contactList">Contact List</a>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
XML数据库设置为
<contactdatabase>
<contact>
<firstName />
<lastName />
<address />
<city />
<state />
<zipcode />
<country />
<email />
<phone />
<mail />
<phonenum />
<emailaddress />
<comment />
<id />
</contact>
</contactdatabase>
答案 0 :(得分:2)
选择所需contact
元素的正确XPath表达式为contactdatabase/contact[id = $currentID]
。
而不是for-each
我会使用apply-templates
格式化具有给定ID的contact
元素,并编写一个单独的模板来匹配contact
元素。它看起来像这样。
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="url"/>
<xsl:variable name="currentID" select="substring-after($url, 'id=')"/>
<xsl:template match="/">
<html>
<head>
<title>Contact Database - Contact Viewer</title>
<style>
h1 {
color:white;
background-color:black;
border-style:solid;
border-color:#981b1e;
padding-left:10px;
font-weight:bold;
}
</style>
</head>
<body>
<h1>Contact Viewer</h1>
<xsl:value-of select="$currentID"/>
<xsl:apply-templates select="contactdatabase/contact[id = $currentID]"/>
<a href="contactList">Contact List</a>
</body>
</html>
</xsl:template>
<xsl:template match="contact">
<table cellspacing="5" border="3">
<tr height="60">
<td width="70px">
<xsl:value-of select="firstName"/>
</td>
<td width="100px">
<xsl:value-of select= "lastName"/>
</td>
<td width="120px">
<xsl:value-of select="firstName"/>
</td>
<td width="90px">
<xsl:value-of select="firstName"/>
</td>
<td width="35px">
<xsl:value-of select="state"/>
</td>
<td width="44px">
<xsl:value-of select="zipcode"/>
</td>
<td width="60px">
<xsl:value-of select="country"/>
</td>
<td width="80">
<xsl:value-of select="email"/> <br></br>
<xsl:value-of select="home"/> <br></br>
<xsl:value-of select="mail"/>
</td>
<td width="80">
<xsl:value-of select="phonenum"/>
</td>
<td width="180">
<xsl:value-of select="emailaddress"/>
</td>
<td width="120px">
<a href="contactViewer?contactid={id}">view</a> / edit / delete
</td>
</tr>
</table>
</xsl:template>
</xsl:stylesheet>