我正在研究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页面的顶部,我们有三个链接:
在同一个HTML页面的底部,我们有三个链接:
如果用户点击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>
然而,它并没有真正起作用。
任何人都可以举个例子吗?
感谢。
答案 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>