使用XSLT样式表将DocBookXML列表转换为WordML

使用XSLT样式表将DocBookXML列表转换为WordML,xml,xslt,xslt-1.0,wordml,wordprocessingml,Xml,Xslt,Xslt 1.0,Wordml,Wordprocessingml,我想将以下XML转换为WordML: <document> <section> <para>An ordered list:</para> <orderedlist> <listitem>first list item</listitem> <listitem>second list item <orderedlist>

我想将以下XML转换为WordML:

<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>

但是这个

  • 不适用于嵌套列表
  • orderedlist的每个listitem的列表ID(“position()”)都应该相同
  • 有人能帮我吗?尤其是嵌套列表部分

    见:

    预期产出:

    <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>
    
    
    第一个清单项目
    第二个清单项目
    一
    二
    一
    二
    三
    三
    第三个清单项目
    
    阅读代码很困难,因为(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格式取决于处理器)。

    您能发布预期的输出代码吗?我添加了预期的输出。非常感谢!下一次,我将准备一个更好的最小示例。:-)