2015-07-16 7 views
1

я следующий XML Я хотел бы перевести WordML:Transform Docbook списки XML в WordML с помощью таблицы стилей XSLT

<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. Идентификатор списка («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> 
+0

Не могли бы вы вывести ожидаемый выходной код? –

+0

Я добавил ожидаемый результат. – user2496550

ответ

1

Это трудно читать ваш код, потому что (а) это не отступом надлежащим образом и (б) она вырвана из контекста. Вероятно, вы могли бы удалить значительную часть его, оставив только то, что необходимо для понимания проблемы.

Я подозреваю, что что-то подобное может работать вам:

XSLT 1,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 зависит от процессора).

+0

Спасибо большое! И в следующий раз я подготовлю лучший минимальный пример. :-) – user2496550

 Смежные вопросы

  • Нет связанных вопросов^_^