使用 XSLT 样式表将 Docbook XML 列表转换为 WordML
Transform Docbook XML lists into WordML using XSLT stylesheet
我有以下 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>
但是这个
- 不适用于嵌套列表。
- 有序列表的每个列表项的列表 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>
很难阅读您的代码,因为 (a) 缩进不正确,以及 (b) 断章取义。您可能也删除了其中的很大一部分,只留下理解问题所必需的部分。
我怀疑这样的事情对你有用:
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 格式取决于处理器)。
我有以下 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>
但是这个
- 不适用于嵌套列表。
- 有序列表的每个列表项的列表 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>
很难阅读您的代码,因为 (a) 缩进不正确,以及 (b) 断章取义。您可能也删除了其中的很大一部分,只留下理解问题所必需的部分。
我怀疑这样的事情对你有用:
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 格式取决于处理器)。