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 に答える