1

WordML に変換したい次の XML があります。

<document>
<section>
    <para>An ordered list:</para>
    <orderedlist>
        <listitem>first list item</listitem>
        <listitem>second list item
            <orderedlist>
                <listitem>one</listitem>
                <listitem>two
                    <orderedlist>
                        <listitem>one</listitem>
                        <listitem>two</listitem>
                        <listitem>three</listitem>
                    </orderedlist>
                </listitem>
                <listitem>three</listitem>
            </orderedlist>
        </listitem>
        <listitem>third list item</listitem>
    </orderedlist>
</section>
</document>

これは、これまでの私の XSLT 1.0 スタイルシート テンプレートです。

<xsl:template match="document/section/orderedlist">
  <xsl:for-each select="listitem">
  <w:p>
    <w:pPr><w:pStyle w:val="Normal"/><w:numPr>
            <w:ilvl w:val="{count(ancestor::orderedlist)-1}"/>  <!-- level of list item (0,1,2 etc.) -->
            <w:numId w:val="{position()}"/>  <!-- the orderedlist should get an ID (1,2,3 etc.) -->
        </w:numPr>
    </w:pPr>
    <w:r><w:t><xsl:value-of select="."/></w:t></w:r>
  </w:p>
  <xsl:apply-templates />
  </xsl:for-each>
</xsl:template>

でもこれは

  1. ネストされたリストでは機能しません。
  2. リストの ID ("position()") は、順序付きリストのすべてのリスト項目で同じでなければなりません。

誰でも私を助けることができますか?特にネストされたリストの部分では。

参照: http://xsltransform.net/jyH9rN8

期待される出力:

<w:p>
  <w:pPr><w:pStyle w:val="Normal"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="1"/></w:numPr></w:pPr>
  <w:r><w:t>first list item</w:t></w:r>
</w:p>
<w:p>
  <w:pPr><w:pStyle w:val="Normal"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="1"/></w:numPr></w:pPr>
  <w:r><w:t>second list item</w:t></w:r>
</w:p>
<w:p>
  <w:pPr><w:pStyle w:val="Normal"/><w:numPr><w:ilvl w:val="1"/><w:numId w:val="1"/></w:numPr></w:pPr>
  <w:r><w:t>one</w:t></w:r>
</w:p>
<w:p>
  <w:pPr><w:pStyle w:val="Normal"/><w:numPr><w:ilvl w:val="1"/><w:numId w:val="1"/></w:numPr></w:pPr>
  <w:r><w:t>two</w:t></w:r>
</w:p>
<w:p>
  <w:pPr><w:pStyle w:val="Normal"/><w:numPr><w:ilvl w:val="2"/><w:numId w:val="1"/></w:numPr></w:pPr>
  <w:r><w:t>one</w:t></w:r>
</w:p>
<w:p>
  <w:pPr><w:pStyle w:val="Normal"/><w:numPr><w:ilvl w:val="2"/><w:numId w:val="1"/></w:numPr></w:pPr>
  <w:r><w:t>two</w:t></w:r>
</w:p>
<w:p>
  <w:pPr><w:pStyle w:val="Normal"/><w:numPr><w:ilvl w:val="2"/><w:numId w:val="1"/></w:numPr></w:pPr>
  <w:r><w:t>three</w:t></w:r>
</w:p>
<w:p>
  <w:pPr><w:pStyle w:val="Normal"/><w:numPr><w:ilvl w:val="1"/><w:numId w:val="1"/></w:numPr></w:pPr>
  <w:r><w:t>three</w:t></w:r>
</w:p>
<w:p>
  <w:pPr><w:pStyle w:val="Normal"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="1"/></w:numPr></w:pPr>
  <w:r><w:t>third list item</w:t></w:r>
</w:p>
4

1 に答える 1

1

(a) 適切にインデントされておらず、(b) 文脈から外れているため、コードを読むのは困難です。問題を理解するために不可欠なものだけを残して、おそらくそのかなりの部分も削除できたはずです。

このようなものがうまくいくと思います:

XSLT1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/document">
    <w:wordDocument>
        <xsl:apply-templates/>
    </w:wordDocument>
</xsl:template>

<xsl:template match="listitem">
    <w:p>
        <w:pPr>
            <w:pStyle w:val="Normal"/>
            <w:numPr>
                <!-- level of list item (0,1,2 etc.) -->
                <w:ilvl w:val="{count(ancestor::orderedlist)-1}"/>
                <!-- the ordered list should get an ID (1,2,3 etc.) -->
                <w:numId w:val="{generate-id(..)}"/>
            </w:numPr>
        </w:pPr>
        <w:r>
            <w:t>
                <xsl:value-of select="text()"/>
            </w:t>
        </w:r>
    </w:p>
    <xsl:apply-templates />
</xsl:template>

<xsl:template match="text()"/>

</xsl:stylesheet>

入力例に適用すると、結果は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml">
   <w:p>
      <w:pPr>
         <w:pStyle w:val="Normal"/>
         <w:numPr>
            <w:ilvl w:val="0"/>
            <w:numId w:val="d0e5"/>
         </w:numPr>
      </w:pPr>
      <w:r>
         <w:t>first list item</w:t>
      </w:r>
   </w:p>
   <w:p>
      <w:pPr>
         <w:pStyle w:val="Normal"/>
         <w:numPr>
            <w:ilvl w:val="0"/>
            <w:numId w:val="d0e5"/>
         </w:numPr>
      </w:pPr>
      <w:r>
         <w:t>second list item
                </w:t>
      </w:r>
   </w:p>
   <w:p>
      <w:pPr>
         <w:pStyle w:val="Normal"/>
         <w:numPr>
            <w:ilvl w:val="1"/>
            <w:numId w:val="d0e10"/>
         </w:numPr>
      </w:pPr>
      <w:r>
         <w:t>one</w:t>
      </w:r>
   </w:p>
   <w:p>
      <w:pPr>
         <w:pStyle w:val="Normal"/>
         <w:numPr>
            <w:ilvl w:val="1"/>
            <w:numId w:val="d0e10"/>
         </w:numPr>
      </w:pPr>
      <w:r>
         <w:t>two
                        </w:t>
      </w:r>
   </w:p>
   <w:p>
      <w:pPr>
         <w:pStyle w:val="Normal"/>
         <w:numPr>
            <w:ilvl w:val="2"/>
            <w:numId w:val="d0e15"/>
         </w:numPr>
      </w:pPr>
      <w:r>
         <w:t>one</w:t>
      </w:r>
   </w:p>
   <w:p>
      <w:pPr>
         <w:pStyle w:val="Normal"/>
         <w:numPr>
            <w:ilvl w:val="2"/>
            <w:numId w:val="d0e15"/>
         </w:numPr>
      </w:pPr>
      <w:r>
         <w:t>two</w:t>
      </w:r>
   </w:p>
   <w:p>
      <w:pPr>
         <w:pStyle w:val="Normal"/>
         <w:numPr>
            <w:ilvl w:val="2"/>
            <w:numId w:val="d0e15"/>
         </w:numPr>
      </w:pPr>
      <w:r>
         <w:t>three</w:t>
      </w:r>
   </w:p>
   <w:p>
      <w:pPr>
         <w:pStyle w:val="Normal"/>
         <w:numPr>
            <w:ilvl w:val="1"/>
            <w:numId w:val="d0e10"/>
         </w:numPr>
      </w:pPr>
      <w:r>
         <w:t>three</w:t>
      </w:r>
   </w:p>
   <w:p>
      <w:pPr>
         <w:pStyle w:val="Normal"/>
         <w:numPr>
            <w:ilvl w:val="0"/>
            <w:numId w:val="d0e5"/>
         </w:numPr>
      </w:pPr>
      <w:r>
         <w:t>third list item</w:t>
      </w:r>
   </w:p>
</w:wordDocument>

または同様のもの (id 形式はプロセッサに依存します)。

于 2015-07-16T14:52:58.977 に答える