-1

下面是我的 XML 代码 -

<Para>
  <Desc>....</Desc>
  <References>
    <BookRef>
      <BookName>ABC of HTML</BookName>
      <Chapter>1</Chapter>
      <BookName>HTML : The Complete Reference</BookName>
      <Chapter>1</Chapter>
    </BookRef>
  </References>
</Para>
<Para>
  <Desc>....</Desc>
  <References>
    <BookRef>
      <BookName>ABC of XML</BookName>
      <Chapter>2</Chapter>
      <BookName>XML : The Complete Reference</BookName>
      <Chapter>10</Chapter><Chapter>11</Chapter>
    </BookRef>
  </References>
</Para>

我需要使用 . 以表格格式显示以上内容HTML Table Tag。所以它应该看起来像 -

Description of Paragraph (the text between the Desc tags)

**Book Name**                                  **Chapters**
ABC of HTML                                      1
HTML: The Complete Reference                     1

Description of Paragraph (the text between the Desc tags)

**Book Name**                                  **Chapters**
ABC of XML                                       2
HTML: The Complete Reference                     10, 11

读者可以直接跳到上述章节,我已经创建了超链接。下面是 XSLT 代码 -

<xsl:template match="References">
   <xsl:if test="CaseRef != ''"><br/>
      <table border="1" width="100%">
      <tr>
        <td width="75%">Book Name</td>
        <td align="right">Chapters</td>
      </tr>
      <xsl:for-each select="BookName">
      <tr>
        <td valign="top">
          <xsl:value-of select="."/>
        </td>
        <td align="right" valign="bottom">
          <xsl:for-each select="following::Chapter">
          <a id="lnk">
         <!-- This code will create a hyperlink to jump directly on the said chapter-->
            <xsl:attribute name="href">
              <xsl:value-of select="concat(concat('#',.),./@L)"/>
            </xsl:attribute>
            <xsl:value-of select="."/><xsl:text> </xsl:text>
          </a>
          </xsl:for-each>
        </td>
      </tr>
      </xsl:for-each>
  </table>
   </xsl:if>
</xsl:template>

我缺少一些东西(可能更多)来获得所需的输出!

4

1 回答 1

1

XSLT 有几个问题。首先,在References模板中,您正在遍历BookName名称元素,但这些元素嵌套在BookRef元素中,因此您应该这样做

<xsl:for-each select="BookRef/BookName" />

(或者最好使用应用模板来避免过多的嵌套代码)

下一个问题是这个循环,您可以在其中循环各章

<xsl:for-each select="following::Chapter"> 

这里的问题是它会拾取所有后续的章节元素,即使是那些出现在后续书名元素之后的元素。解决此问题的一种方法是定义一个保留,仅查找给定书籍的那些章节元素。

<xsl:key 
   name="Chapters" 
   match="Chapter" 
   use="generate-id(preceding-sibling::BookName[1])"/>

然后,假设您位于BookName元素上,您可以获得匹配的Chapter元素,如下所示:

<xsl:apply-templates select="key('Chapters', generate-id())"/>

试试下面的 XSLT(注意我已经删除了在你原来的 XSLT 中出现的对CaseRef的引用)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>
   <xsl:key name="Chapters" match="Chapter" use="generate-id(preceding-sibling::BookName[1])"/>

   <xsl:template match="Desc">
      <p>
         <xsl:value-of select="."/>
      </p>
   </xsl:template>

   <xsl:template match="References">
      <br/>
      <table border="1" width="100%">
         <tr>
            <td width="75%">Book Name</td>
            <td align="right">Chapters</td>
         </tr>
         <xsl:apply-templates select="BookRef/BookName"/>
      </table>
   </xsl:template>

   <xsl:template match="BookName">
      <tr>
         <td valign="top">
            <xsl:value-of select="."/>
         </td>
         <td align="right" valign="bottom">
            <xsl:apply-templates select="key('Chapters', generate-id())"/>
         </td>
      </tr>
   </xsl:template>

   <xsl:template match="Chapter">
      <xsl:if test="position() &gt; 1">
         <xsl:text>,</xsl:text>
      </xsl:if>
      <a id="lnk"><!-- This code will create a hyperlink to jump directly on the said chapter-->
         <xsl:attribute name="href">
            <xsl:value-of select="concat(concat('#',.),./@L)"/>
         </xsl:attribute>
         <xsl:value-of select="."/>
         <xsl:text/>
      </a>
   </xsl:template>
</xsl:stylesheet>

当应用于您的 XML(假设它具有单个根元素)时,输出以下内容

<p>....</p>
<br/>
<table border="1" width="100%">
   <tr>
      <td width="75%">Book Name</td>
      <td align="right">Chapters</td>
   </tr>
   <tr>
      <td valign="top">ABC of HTML</td>
      <td align="right" valign="bottom">
         <a id="lnk" href="#1">1</a>
      </td>
   </tr>
   <tr>
      <td valign="top">HTML : The Complete Reference</td>
      <td align="right" valign="bottom">
         <a id="lnk" href="#1">1</a>
      </td>
   </tr>
</table>
<p>....</p>
<br/>
<table border="1" width="100%">
   <tr>
      <td width="75%">Book Name</td>
      <td align="right">Chapters</td>
   </tr>
   <tr>
      <td valign="top">ABC of XML</td>
      <td align="right" valign="bottom">
         <a id="lnk" href="#2">2</a>
      </td>
   </tr>
   <tr>
      <td valign="top">XML : The Complete Reference</td>
      <td align="right" valign="bottom">
         <a id="lnk" href="#10">10</a>,
         <a id="lnk" href="#11">11</a></td>
   </tr>
</table>
于 2012-05-08T08:06:31.773 回答