2013-05-13 48 views
0

我正在制作基本的联系人列表Web应用程序,其中包含三个页面 - 联系人列表页面,用于显示数据库中的所有联系人(存储在XML文件中),联系人查看页面(即显示联系人信息的只读页面)和新建联系人页面(允许您创建新联系人或编辑以前存在的联系人信息)。无法通过XSL变量和XPATH使XSL正确显示

我的问题是与联系人视图页面。每个联系人都有一个ID,并且此ID通过URL传递(即contactViewer?id = mk)。使用这个ID,我希望使用一个简单的xsl来检查URL请求(保存在一个xsl变量中),以便从数据库中选择哪个联系人进行显示。不幸的是,在添加“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> 

回答

2

正确XPath表达式来选择所需的contact元件是contactdatabase/contact[id = $currentID]

for-each相反我会使用apply-templatescontact元件具有给定的ID的格式,并写一个单独的模板匹配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>