html页面上的XSL超链接

时间:2013-02-22 08:01:19

标签: html xml xslt hyperlink

我正在研究XSL,我对在一个HTML文件中生成双向超链接有疑问。

例如,我们有

<person id="first">
-<name>Bob</name>
-<age>19<age>
<person id="second">
-<name>smith</name>
-<age>12<age>
<person id="third">
-<name>Lisa</name>
-<age>30<age>

在XML文件中,我想在一个带有XSLT的HTML页面上创建3个超链接。

例如,在HTML页面的顶部,我们有三个链接:

  1. 鲍勃
  2. 史密斯
  3. 莉莎
  4. 在同一个HTML页面的底部,我们有三个链接:

    1. 鲍勃
    2. 史密斯
    3. 莉莎
    4. 如果用户点击1. Bob,我们会转到页面底部的4. Bob(1. Bob&lt; - &gt; 4. Bob)

      如果用户点击4. Bob,我们会转到页面底部的1. Bob。

      如果用户点击2.史密斯,我们转到5.史密斯页面底部(5.史密斯&lt; - &gt; 5.Smith)

      如果用户点击5. Smith,我们会转到2. Smith页面底部

      我尝试使用<a id="some value"> </a>

      然而,它并没有真正起作用。

      任何人都可以举个例子吗?

      感谢。

2 个答案:

答案 0 :(得分:3)

如果您要导航到页面中的锚标记,则需要将 href 属性设置为适当值的其他链接。例如,如果您锚定标记是这样的:

<a id="first">Bob</a>

然后您的链接就像这样

<a href="#first">Bob</a>

在您的情况下,您希望锚点相互链接,因此 a 元素同时具有 id href

<a id="first_top" href="#first_bottom">Bob</a>
<a id="first_bottom" href="#first_top">Bob</a>

对XSLT进行编码的一种方法是使用两个匹配元素的模板,但使用模式属性来区分它们

试试这个XSLT例如

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html" indent="yes"/>
   <xsl:template match="/people">
      <html>
         <body>
            <xsl:apply-templates select="person" mode="top"/>
            <p>
               Some content in the middle
            </p>
            <xsl:apply-templates select="person" mode="bottom"/>
         </body>
      </html>
   </xsl:template>

   <xsl:template match="person" mode="top">
      <p>
         <a id="{@id}_top" href="#{@id}_bottom">
            <xsl:value-of select="name" />
         </a>
      </p>
   </xsl:template>

   <xsl:template match="person" mode="bottom">
      <p>
         <a id="{@id}_bottom" href="#{@id}_top">
            <xsl:value-of select="name" />
         </a>
      </p>
   </xsl:template>
</xsl:stylesheet>

这将输出以下内容(假设您具有格式良好的XML,其中包含根元素,并且所有标记都已关闭)

<html>
<body>
<p><a id="first_top" href="#first_bottom">Bob</a></p>
<p><a id="second_top" href="#second_bottom">smith</a></p>
<p><a id="third_top" href="#third_bottom">Lisa</a></p>
<p>Some content in the middle</p>
<p><a id="first_bottom" href="#first_top">Bob</a></p>
<p><a id="second_bottom" href="#second_top">smith</a></p>
<p><a id="third_bottom" href="#third_top">Lisa</a></p>
</body>
</html>

如果您想避免使用两个单独的模板来匹配元素,则可以将参数传递给模板,以区分顶部和底部。这个XSLT也可以工作

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html" indent="yes"/>
   <xsl:template match="/people">
      <html>
         <body>
            <xsl:apply-templates select="person">
                <xsl:with-param name="idpos" select="'top'" />
                <xsl:with-param name="hrefpos" select="'bottom'" />
            </xsl:apply-templates>
            <p>
               Some content in the middle
            </p>
            <xsl:apply-templates select="person">
                <xsl:with-param name="idpos" select="'bottom'" />
                <xsl:with-param name="hrefpos" select="'top'" />
            </xsl:apply-templates>
         </body>
      </html>
   </xsl:template>

   <xsl:template match="person">
      <xsl:param name="idpos" />
      <xsl:param name="hrefpos" />
      <p>
         <a id="{@id}_{$idpos}" href="#{@id}_{$hrefpos}">
            <xsl:value-of select="name" />
         </a>
      </p>
   </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:1)

这不一定是XSLT问题,您只需要生成相应的<a id="link1" href="#link4">...</a>,反之亦然。例如,顶部链接可以是

<xsl:for-each select="person">
  <a id="top_{@id}" href="#bottom_{@id}">
    <xsl:value-of select="name"/>
  </a>
</xsl:for-each>