1

次のように本を説明する XML があります。

<root>
    <chapter>
        <chapter_number>some chapter</chapter_number>
        <chapter_title>some title</chapter_title>

        <heading_1>some heading</heading_1>

        <para>some plain text <italic>some italic text</italic> some more text</para>

        <list_1_letter>item 1</list_1_letter>
        <list_1_letter>item 2</list_1_letter>
        <list_2_bullet>sub-item 1</list_2_bullet>
        <list_2_bullet>sub-item 2</list_2_bullet>
        <list_1_letter>item 3</list_1_letter>

        <para>some other text</para>

        <list_1_number>item 1</list_1_number>
        <list_2_roman>sub-item 1</list_2_roman>
        <list_2_roman>sub-item 2</list_2_roman>
        <list_1_number>item 2</list_1_number>
        <list_2_roman>sub-item 3</list_2_roman>
        <list_2_roman>sub-item 4</list_2_roman>
    </chapter>
</root>

リストはそれらを記述する要素でラップする必要がありますが、サブリストはその上のリストの子にする必要があります。この場合、望ましい出力は次のようになります。

<root>
    <chapter>
        <chapter_number>some chapter</chapter_number>
        <chapter_title>some title</chapter_title>

        <heading_1>some heading</heading_1>

        <para>some plain text <italic>some italic text</italic> some more text</para>

        <letter_list>
            <list_1_letter>item 1</list_1_letter>
            <list_1_letter>item 2</list_1_letter>
            <bullet_list>
                <list_2_bullet>sub-item 1</list_2_bullet>
                <list_2_bullet>sub-item 2</list_2_bullet>
            </bullet_list>
            <list_1_letter>item 3</list_1_letter>
        </letter_list>

        <para>some other text</para>

        <number_list>
            <list_1_number>item 1</list_1_number>
            <roman_list>
                <list_2_roman>sub-item 1</list_2_roman>
                <list_2_roman>sub-item 2</list_2_roman>
            </roman_list>
            <list_1_number>item 2</list_1_number>
            <roman_list>
                <list_2_roman>sub-item 3</list_2_roman>
                <list_2_roman>sub-item 4</list_2_roman>
            </roman_list>
        </number_list>
    </chapter>
</root>

ここから他のいくつかの回答を適応させると、リストをラップできますが、同じリストのシーケンスのみをラップできます。生成されるのは次のとおりです。

<number_list>
    <list_1_number>item 1</list_1_number>
</number_list>
<roman_list>
    <list_2_roman>sub-item 1</list_2_roman>
    <list_2_roman>sub-item 2</list_2_roman>
</roman_list>
<number_list>
    <list_1_number>item 2</list_1_number>
</number_list>
<roman_list>
    <list_2_roman>sub-item 3</list_2_roman>
    <list_2_roman>sub-item 4</list_2_roman>
</roman_list>

私が求めているものとはまったく違います!これは、これを引き受けたときに予想していたよりもはるかにトリッキーであることが証明されています.

4

1 に答える 1

0
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">


<xsl:strip-space elements="*"/>
<xsl:output indent="yes" omit-xml-declaration="yes"/>

<xsl:template match="*">
 <xsl:copy>
  <xsl:for-each-group select="node()" group-adjacent="starts-with(name(),'list')">
   <xsl:choose>
    <xsl:when test="current-grouping-key()">
     <xsl:element name="{replace(name(),'.*_.*_','')}_list">
      <xsl:variable name="thislist" select="name()"/>
      <xsl:for-each-group select="current-group()" group-adjacent="name()">
       <xsl:choose>
    <xsl:when test="name()=$thislist">
     <xsl:copy-of select="current-group()"/>
    </xsl:when>
    <xsl:otherwise>
     <xsl:element name="{replace(name(),'.*_.*_','')}_list">
     <xsl:copy-of select="current-group()"/>
     </xsl:element>
    </xsl:otherwise>
       </xsl:choose>
      </xsl:for-each-group>
     </xsl:element>
    </xsl:when>
    <xsl:otherwise>
      <xsl:apply-templates select="current-group()"/>
    </xsl:otherwise>
   </xsl:choose>
  </xsl:for-each-group>
 </xsl:copy>
</xsl:template>

</xsl:stylesheet>

プロデュース

<root>
   <chapter>
      <chapter_number>some chapter</chapter_number>
      <chapter_title>some title</chapter_title>
      <heading_1>some heading</heading_1>
      <para>some plain text <italic>some italic text</italic> some more text</para>
      <letter_list>
         <list_1_letter>item 1</list_1_letter>
         <list_1_letter>item 2</list_1_letter>
         <bullet_list>
            <list_2_bullet>sub-item 1</list_2_bullet>
            <list_2_bullet>sub-item 2</list_2_bullet>
         </bullet_list>
         <list_1_letter>item 3</list_1_letter>
      </letter_list>
      <para>some other text</para>
      <number_list>
         <list_1_number>item 1</list_1_number>
         <roman_list>
            <list_2_roman>sub-item 1</list_2_roman>
            <list_2_roman>sub-item 2</list_2_roman>
         </roman_list>
         <list_1_number>item 2</list_1_number>
         <roman_list>
            <list_2_roman>sub-item 3</list_2_roman>
            <list_2_roman>sub-item 4</list_2_roman>
         </roman_list>
      </number_list>
   </chapter>
</root>
于 2013-10-05T16:48:42.013 に答える