Мне нужно импортировать многоуровневый нумерованный список из xhtml в docx.
При импорте списка в docx создается один абстрактный список в NumberingDefinitionsPart.
Абстрактный список определяет стиль нумерованного списка, и он должен быть одинаковым для всех элементов списка.
Но для некоторых элементов списка разные конкретные списки
с разными NumId генерируются в NumberingDefinitionsPart.
Конкретные списки переопределяют стиль нумерованного списка, определенный в абстрактном списке. Но нет необходимости менять стиль в нумерованном списке, так как он один и тот же.
Ниже приведен xhtml оригинального нумерованного списка:
<ol>
<li>level 1
<ol>
<li>level 1.1</li>
</ol>
</li>
<li>level 2
<ol>
<li>level 2.1</li>
<li>level 2.2</li>
</ol>
</li>
</ol>
После преобразования в docx конвертируется в такой контент:
<w:p>
<w:pPr>
<w:numPr>
<w:ilvl w:val="0"/>
<w:numId w:val="3"/>
</w:numPr>
<w:spacing w:after="0"/>
</w:pPr>
<w:r>
<w:t>level 1</w:t>
</w:r>
</w:p>
<w:p>
<w:pPr>
<w:numPr>
<w:ilvl w:val="1"/>
<w:numId w:val="3"/>
</w:numPr>
<w:spacing w:after="0"/>
</w:pPr>
<w:r>
<w:t>level 1.1</w:t>
</w:r>
</w:p>
<w:p>
<w:pPr>
<w:numPr>
<w:ilvl w:val="0"/>
<w:numId w:val="3"/>
</w:numPr>
<w:spacing w:after="0"/>
</w:pPr>
<w:r>
<w:t>level 2</w:t>
</w:r>
</w:p>
<w:p>
<w:pPr>
<w:numPr>
<w:ilvl w:val="1"/>
<w:numId w:val="4"/>
</w:numPr>
<w:spacing w:after="0"/>
</w:pPr>
<w:r>
<w:t>level 2.1</w:t>
</w:r>
</w:p>
<w:p>
<w:pPr>
<w:numPr>
<w:ilvl w:val="1"/>
<w:numId w:val="4"/>
</w:numPr>
<w:spacing w:after="0"/>
</w:pPr>
<w:r>
<w:t>level 2.2</w:t>
</w:r>
</w:p>
Таким образом, для элементов списка вплоть до "уровня 4" его w: numId равно 3, но начиная с элемента "уровня 4.1" его w: numId равно 4. Это не ясно, поскольку нумерация одинакова и стиль нумерации не должен были изменены.
В результате при экспорте нумерованного списка обратно в xhtml нумерация элементов списка прерывается и перезапускается с 0 при изменении конкретного списка.
Версия Docx4j - 6.1.2, xHTMLImporter вызывается следующим образом:
String strRich;//string with xhtml
StringBuilder sb = new StringBuilder();
sb.append("<html>").append("<head>").append("<style type='text/css'>")
.append("h1, h2, h3, h4, h5, h6{ font-size:12pt;}")
.append("body { font-size:12pt;}")
.append("</style>").append("</head>")
.append("<body>")
.append(strRich)
.append("</body>")
.append("</html>");
XHTMLImporterImpl xHTMLImporter = new XHTMLImporterImpl(inwordMLPackage);
xHTMLImporter.setRunFormatting(FormattingOption.IGNORE_CLASS);
xHTMLImporter.setTableFormatting(FormattingOption.IGNORE_CLASS);
xHTMLImporter.setHyperlinkStyle("Hyperlink");
List<Object> addhtml = xHTMLImporter.convert(sb.toString(), null);