0

我正在研究 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. 丽莎

在同一个 HTML 页面的底部,我们有三个链接:

  1. 鲍勃
  2. 史密斯
  3. 丽莎

如果用户点击 1. Bob,我们转到页面底部的 4. Bob (1. Bob <-> 4. Bob)

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

如果用户点击 2. Smith,我们转到页面底部的 5. Smith (5. Smith <-> 5.Smith)

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

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

然而,它并没有真正奏效。

谁能举个例子??

谢谢。

4

2 回答 2

3

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

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

那么您的链接将是这样的

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

在您的情况下,您希望锚点相互链接,因此两个a元素都将具有idhref

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

编写 XSLT 代码的一种方法是使用两个模板匹配people元素,但使用mode属性来区分它们

例如试试这个 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>
于 2013-02-22T08:38:30.343 回答
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>
于 2013-02-22T08:41:23.583 回答