Xslt用于分割部分的URL并再次梳理它们

时间:2013-03-08 11:30:30

标签: url xslt

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

http://server/site1/site2/site3

并希望构建类似

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

如何使用xslt执行此操作?

1 个答案:

答案 0 :(得分: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>