0

我想建立一种面包屑。例如,我有链接

http://server/site1/site2/site3

并想建立类似的东西

<a href="http://server">http://server</a><a href="http://server/site1">http://server/site1</a>...

我怎样才能用 xslt 做到这一点?

4

1 回答 1

3

这可以通过递归模板来完成:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:variable name="urlSample" select="'http://server/site1/site2/site3'" />

  <xsl:template match="/">
    <xsl:call-template name="UrlLinks">
      <xsl:with-param name="url" select="$urlSample" />
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="UrlLinks">
    <xsl:param name="url" />
    <xsl:call-template name="UrlLinksIter">
      <xsl:with-param name="portionSoFar" select="concat(substring-before($url, '://'), '://')" />
      <xsl:with-param name="remainder" select="concat(substring-after($url, '://'), '/')" />
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="UrlLinksIter">
    <xsl:param name="portionSoFar" />
    <xsl:param name="remainder" />

    <xsl:variable name="nextPart" select="substring-before($remainder, '/')" />
    <xsl:variable name="nextRemainder" select="substring-after($remainder, '/')" />
    <xsl:if test="normalize-space($nextRemainder) or normalize-space($nextPart)">
      <xsl:variable name="url" select="concat($portionSoFar, $nextPart)"/>
      <xsl:if test="normalize-space($nextPart)">
        <!-- $nextPart could be empty if there are multiple slashes in a row-->
        <a href="{$url}">
          <xsl:value-of select="$url"/>
        </a>
      </xsl:if>
      <xsl:call-template name="UrlLinksIter">
        <xsl:with-param name="portionSoFar" select="concat($url, '/')" />
        <xsl:with-param name="remainder" select="$nextRemainder" />
      </xsl:call-template>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

当这在任何输入上运行时(因为样本值在此处的变量中),这会产生:

<a href="http://server">http://server</a>
<a href="http://server/site1">http://server/site1</a>
<a href="http://server/site1/site2">http://server/site1/site2</a>
<a href="http://server/site1/site2/site3">http://server/site1/site2/site3</a>
于 2013-03-08T12:18:54.233 回答