Преобразование курсивных XML-тегов в теги WordML
Мне просто нужно преобразовать XML-документ в документ WordML (если это можно назвать простым!) С помощью этой формы (без инструкций по обработке):
<body>
<p>
<r>This is the <italic>standard</italic> text run.</r>
</p>
</body>
Преобразованный XML должен выглядеть следующим образом согласно документу WordML:
<w:body>
<w:p>
<w:r>
<w:t>This is the </w:t>
</w:r>
</w:p>
<w:p>
<w:pPr>
<w:i/>
</w:pPr>
<w:r>
<w:t>standard</w:t>
</w:r>
</w:p>
<w:p>
<w:r>
<w:t> text run.</w:t>
</w:r>
</w:p>
</w:body>
Как мне создать XSLT-преобразование для правильной обработки курсивных тегов??..
2 ответа
Решение
Это преобразование:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:w="some:w" exclude-result-prefixes="w">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="body">
<w:body>
<xsl:apply-templates/>
</w:body>
</xsl:template>
<xsl:template match="p/r/text()">
<w:p>
<w:r>
<w:t><xsl:value-of select="."/></w:t>
</w:r>
</w:p>
</xsl:template>
<xsl:template match="p/r/italic/text()">
<w:p>
<w:pPr>
<w:i/>
</w:pPr>
<w:r>
<w:t><xsl:value-of select="."/></w:t>
</w:r>
</w:p>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
при применении к предоставленному документу XML:
<body>
<p>
<r>This is the <italic>standard</italic> text run.</r>
</p>
</body>
дает желаемый, правильный результат:
<w:body xmlns:w="some:w">
<w:p>
<w:r>
<w:t>This is the </w:t>
</w:r>
</w:p>
<w:p>
<w:pPr>
<w:i/>
</w:pPr>
<w:r>
<w:t>standard</w:t>
</w:r>
</w:p>
<w:p>
<w:r>
<w:t> text run.</w:t>
</w:r>
</w:p>
</w:body>
Для такого простого ввода, как в приведенном примере, будет работать следующая таблица стилей. Использование измененного преобразования идентичности со специализированными шаблонами для <italics>
а также r/text()
,
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml">
<xsl:output indent="yes"/>
<xsl:template match="@*|node()">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="body">
<w:body>
<xsl:apply-templates/>
</w:body>
</xsl:template>
<xsl:template match="r/text()">
<w:p>
<w:r>
<w:t><xsl:value-of select="."/></w:t>
</w:r>
</w:p>
</xsl:template>
<xsl:template match="r/italic">
<w:p>
<w:pPr>
<w:i/>
</w:pPr>
<w:r>
<w:t><xsl:value-of select="."/></w:t>
</w:r>
</w:p>
</xsl:template>
</xsl:stylesheet>