2013-05-13 66 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>