2

我有一个这样的 HTML 文件:

<root>
    <br>
    <h3>The first H3 text</h3><br>
    <p>para1 content in first H3</p><br>
    <p>para2 content in first H3</p><br>
    <h3>The second H3 text</h3><br>
    <p>para1 content in second H3</p><br>
    <p>para2 content in second H3</p><br>
    <p>para3 content in second H3</p><br>
    <p>para4 content in second H3</p><br>
</root>

我想编写一个 XSL,它提供如下输出:

<sec>
    <br />
    <secHead>The first H3 text</secHead><br />
    <para>para1 content in first H3</para><br />
    <para>para2 content in first H3</para><br />
</sec>
<br />
<sec>
    <br/>
    <secHead>The second H3 text</secHead><br/>
    <para>para1 content in second H3</para><br/>
    <para>para2 content in second H3</para><br/>
    <para>para3 content in second H3</para><br/>
    <para>para4 content in second H3</para><br/>
</sec>

我们如何通过 XSL 获得这个输出?

4

1 回答 1

1

好问题,+1。

这种转变:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kFollowing" match="*[not(self::h3)]"
  use="generate-id(preceding-sibling::h3[1])"/>

 <xsl:template match="/*">
  <xsl:apply-templates select="h3"/>
 </xsl:template>

 <xsl:template match="h3">
    <xsl:if test="position() > 1">
     <br />
    </xsl:if>
     <sec>
      <br />
      <secHead><xsl:value-of select="."/></secHead>
      <xsl:copy-of select="key('kFollowing', generate-id())"/>
     </sec>
 </xsl:template>
</xsl:stylesheet>

在提供的源上应用时(html 必须转换为格式良好的 XML!!!):

<root>
    <br/>
    <h3>The first H3 text</h3><br/>
    <p>para1 content in first H3</p><br/>
    <p>para2 content in first H3</p><br/>
    <h3>The second H3 text</h3><br/>
    <p>para1 content in second H3</p><br/>
    <p>para2 content in second H3</p><br/>
    <p>para3 content in second H3</p><br/>
    <p>para4 content in second H3</p><br/>
</root>

产生想要的正确结果

<sec>
   <br/>
   <secHead>The first H3 text</secHead>
   <br/>
   <p>para1 content in first H3</p>
   <br/>
   <p>para2 content in first H3</p>
   <br/>
</sec>
<br/>
<sec>
   <br/>
   <secHead>The second H3 text</secHead>
   <br/>
   <p>para1 content in second H3</p>
   <br/>
   <p>para2 content in second H3</p>
   <br/>
   <p>para3 content in second H3</p>
   <br/>
   <p>para4 content in second H3</p>
   <br/>
</sec>

说明

这个解决方案的关键点是我们定义了xsl:key一个元素和它所有紧随其后的兄弟元素之间的关系h3(这样它们就不是h3它们自己,这h3是它们的第一个h3前面的兄弟元素)。

于 2011-12-17T16:48:42.030 回答