如何在XSLT中使用节点两次?

时间:2013-02-07 11:35:20

标签: xml xslt

在我的XML中,我有章节的章节,我需要生成一个目录,以便:

<chapter id="1"><title>Chapter 1</title><p>text</p></chapter>
<chapter id="2"><title>Chapter 2</title><p>text</p></chapter>

转换为

<!-- Table Of Contents -->
<div class="contents">
  <ul>
    <li><a href="#1">Chapter 1</a></li>
    <li><a href="#2">Chapter 2</a></li>
  </ul>
</div>

<!-- Actual Content -->
<div class="chapter" id="1"><p>text</p></div>
<div class="chapter" id="2"><p>text</p></div>

不幸的是,当我尝试使用xsl:for-each生成目录时,实际的章节似乎从输出中消失了。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:6)

这个XSLT:

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

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/*">
    <div>
      <div class="contents">
        <ul>
          <xsl:apply-templates select="chapter" mode="contents" />
        </ul>
      </div>

      <xsl:apply-templates select="chapter" />
    </div>
  </xsl:template>

  <xsl:template match="chapter" mode="contents">
    <li>
      <a href="#{@id}">
        <xsl:value-of select="title" />
      </a>
    </li>
  </xsl:template>

  <xsl:template match="chapter">
    <div class="chapter" id="{@id}">
      <xsl:apply-templates select="*" />
    </div>
  </xsl:template>

  <xsl:template match="chapter/title" />
</xsl:stylesheet>

应用于此输入时:

<chapters>
  <chapter id="1">
    <title>Chapter 1</title>
    <p>text</p>
  </chapter>
  <chapter id="2">
    <title>Chapter 2</title>
    <p>text</p>
  </chapter>
</chapters>

将产生:

<div>
  <div class="contents">
    <ul>
      <li>
        <a href="#1">Chapter 1</a>
      </li>
      <li>
        <a href="#2">Chapter 2</a>
      </li>
    </ul>
  </div>
  <div class="chapter" id="1">
    <p>text</p>
  </div>
  <div class="chapter" id="2">
    <p>text</p>
  </div>
</div>

如果你能向我们展示你的XSLT(我认为有2,410个声望点可以提供给你们很明显),我们可以告诉你你做错了什么。