1

私は現在、次の xml を順序付きリストに変換する XSL スクリプトに取り組んでいます。以下の入力と出力のサンプルを参照してください。ちなみにXSLT 2.0を使っています。

**Input:**
<xml>
    <numberedList>1. Number List 1</numberedList>
    <unnumberedList>Child List 1</unnumberedList>
    <unnumberedList>Child List 2</unnumberedList>
    <unnumberedList>Child List 3</unnumberedList>
    <numberedList>2. Number List 2</numberedList>
    <unnumberedList>Child List 1</unnumberedList>
    <numberedList>3. Number List 3</numberedList>
</xml>

**Output:**
<html>
<ol>
    <li>1. Number List 1</li>
    <li>
        <ul>
            <li>Child List 1</li>
            <li>Child List 2</li>
            <li>Child List 3</li>
        </ul>
    </li>
    <li>2. Number List 2</li>
    <li>
        <ul>
            <li>Child List 1</li>
        </ul>
    </li>
    <li>3. Number List 3</li>
</ol>
</html>

どんな助けでも大歓迎です。ありがとう!

4

3 に答える 3

3

Dimitre の XSLT 2.0 ソリューションの改善の試み:

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

 <xsl:template match="/*">
  <html>
   <ol>
     <xsl:for-each-group select="*" group-adjacent="name()">
       <xsl:choose>
         <xsl:when test="self::numberedList">
           <xsl:apply-templates select="current-group()"/>
         </xsl:when>
         <xsl:otherwise>
           <li><ul><xsl:apply-templates select="current-group()"/></ul></li>
         </xsl:otherwise>
       </xsl:choose>
     </xsl:for-each-group>
   </ol>
  </html>
 </xsl:template>

 <xsl:template match="numberedList|unnumberedList">
  <li><xsl:apply-templates/></li>
 </xsl:template>

</xsl:stylesheet>
于 2012-04-20T07:54:42.963 に答える
2

I. 少し短い XSLT 1.0 ソリューション:

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

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

 <xsl:template match="/*">
  <html>
   <xsl:apply-templates select="numberedList[1]" mode="first"/>
  </html>
 </xsl:template>

 <xsl:template match="numberedList" mode="first">
   <ol>
     <xsl:apply-templates select=". | following-sibling::*"/>
   </ol>
 </xsl:template>

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

 <xsl:template match=
 "unnumberedList
      [not(preceding-sibling::*[1][self::unnumberedList])]">
   <li>
     <ul>
       <xsl:apply-templates mode="inUList" select=
           "key('kUlist', generate-id(preceding-sibling::*[1]))"/>
     </ul>
   </li>
 </xsl:template>

 <xsl:template match="*" mode="inUList">
   <li><xsl:value-of select="."/></li>
 </xsl:template>
 <xsl:template match="unnumberedList"/>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<xml>
    <numberedList>1. Number List 1</numberedList>
    <unnumberedList>Child List 1</unnumberedList>
    <unnumberedList>Child List 2</unnumberedList>
    <unnumberedList>Child List 3</unnumberedList>
    <numberedList>2. Number List 2</numberedList>
    <unnumberedList>Child List 1</unnumberedList>
    <numberedList>3. Number List 3</numberedList>
</xml>

必要な正しい結果が生成されます。

<html>
   <ol>
      <li>1. Number List 1</li>
      <li>
         <ul>
            <li>Child List 1</li>
            <li>Child List 2</li>
            <li>Child List 3</li>
         </ul>
      </li>
      <li>2. Number List 2</li>
      <li>
         <ul>
            <li>Child List 1</li>
         </ul>
      </li>
      <li>3. Number List 3</li>
   </ol>
</html>

Ⅱ.XSLT 2.0 ソリューション -- I より 30% 短い。

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

 <xsl:template match="/*">
  <html>
   <ol>
     <xsl:for-each-group select="*" group-adjacent="name()">
       <xsl:apply-templates select="current-group()"/>
     </xsl:for-each-group>
   </ol>
  </html>
 </xsl:template>

 <xsl:template match="*" mode="#default inUList">
  <li><xsl:apply-templates/></li>
 </xsl:template>

 <xsl:template match=
  "unnumberedList[preceding-sibling::*[1][not(self::unnumberedList)]]">
  <li>
   <ul>
    <xsl:apply-templates mode="inUList" select="current-group()"/>
   </ul>
  </li>
 </xsl:template>
 <xsl:template match="unnumberedList"/>
</xsl:stylesheet>

この XSLT 2.0 変換を同じ XML ドキュメント (上記) に適用すると、同じ正しい結果が生成されます。

<html>
   <ol>
      <li>1. Number List 1</li>
      <li>
         <ul>
            <li>Child List 1</li>
            <li>Child List 2</li>
            <li>Child List 3</li>
         </ul>
      </li>
      <li>2. Number List 2</li>
      <li>
         <ul>
            <li>Child List 1</li>
         </ul>
      </li>
      <li>3. Number List 3</li>
   </ol>
</html>
于 2012-04-20T03:31:11.140 に答える
0

間違いなくこれは簡単に実行できますが、次のことを試してください。
説明: 自明です :-)
これは XSLT 1.0 でも機能することに注意してください。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="xml">
        <html>
            <ol>
                <xsl:apply-templates select="numberedList[1]"/>
            </ol>
        </html>
    </xsl:template>
    <xsl:template match="numberedList">
        <li>
            <xsl:value-of select="."/>
        </li>
        <xsl:apply-templates select="following-sibling::*[1]"/>
    </xsl:template>
    <xsl:template match="unnumberedList [local-name(preceding-sibling::*[1]) = 'numberedList']">
        <li>
            <ul>
                <li>
                    <xsl:value-of select="."/>
                </li>
                <xsl:apply-templates select="following-sibling::*[1] [local-name() = 'unnumberedList']"/>
            </ul>
        </li>
        <xsl:apply-templates select="following-sibling::numberedList[1]"/>
    </xsl:template>
    <xsl:template match="unnumberedList [local-name(preceding-sibling::*[1]) = 'unnumberedList']">
        <li>
            <xsl:value-of select="."/>
        </li>
        <xsl:apply-templates select="following-sibling::*[1] [local-name() = 'unnumberedList']"/>
    </xsl:template>
</xsl:stylesheet>

次の結果が得られます。

<?xml version="1.0" encoding="UTF-8"?>
<html>
    <ol>
        <li>1. Number List 1</li>
        <li>
            <ul>
                <li>Child List 1</li>
                <li>Child List 2</li>
                <li>Child List 3</li>
            </ul>
        </li>
        <li>2. Number List 2</li>
        <li>
            <ul>
                <li>Child List 1</li>
            </ul>
        </li>
        <li>3. Number List 3</li>
    </ol>
</html>
于 2012-04-19T23:30:48.887 に答える