无法使用 XSL 变量和 XPATH 正确显示 XSL

  • 本文关键字:XSL XPATH 显示 变量 xml xslt
  • 更新时间 :
  • 英文 :


我正在制作一个具有三个页面的基本联系人列表Web应用程序-联系人列表页面显示DB中的所有联系人(存储在XML文件中),联系人视图页面(这是显示联系人信息的只读页面)和新联系人页面(允许您创建新联系人或编辑以前存在的联系人的信息)。

我的问题是与联系人视图页面。每个联系人都有一个ID,这个ID通过URL传递(即contactViewer? ID =mk)。使用这个ID,我希望使用一个简单的xsl for-each来检查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>

选择所需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>

最新更新