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の間の関係をキャプチャするを定義することです(それらはそれ自体ではなく、これが最初の先行する兄弟であるように)。h3h3h3h3

于 2011-12-17T16:48:42.030 に答える