The world is getting better. And the Word too! Word 2003 Beta2 now understands not only those *.doc files, but XML also. It's all as it should be in open XML world (what makes some people suspicious): there is WordML vocabulary, its schema (well documented one, btw) is available as part of Microsoft Word XML Content Development Kit Beta 2. Having said that it's obvious to go on and to assume that Word documents now may be queried using XPath or XQuery as well as transformed and generated using XSLT. Isn't it fantastic?
So here is "Hello Word!" XSLT stylesheet, which generates minimal, while still valid Word 2003 document:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <xsl:processing-instruction name="mso-application">progid="Word.Document"</xsl:processing-instruction> <w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/2/wordml"> <w:body> <w:p> <w:r> <w:t>Hello Word!</w:t> </w:r> </w:p> </w:body> </w:wordDocument> </xsl:template> </xsl:stylesheet>That <?mso-application progid="Word.Document"?> processing instruction is important one - that's how Windows recognizes an XML document as Word document. Seems like they parse only XML document prolog looking for this PI. Good idea I think.
Now let's try something more interesting - transform some XML document to formatted Word document, containing heading, italic text and link. Consider the following source doc:
<?xml-stylesheet type="text/xsl" href="style.xsl"?> <chapter title="XSLT Programming"> <para>It's <i>very</i> simple. Just ask <link url="http://google.com">Google</link>.</para> </chapter>Then XSLT stylesheet (quite big one due to verbose element-based WordML syntax):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="http://schemas.microsoft.com/office/word/2003/2/wordml"> <xsl:template match="/"> <xsl:processing-instruction name="mso-application">progid="Word.Document"</xsl:processing-instruction> <w:wordDocument> <xsl:apply-templates/> </w:wordDocument> </xsl:template> <xsl:template match="chapter"> <o:DocumentProperties> <o:Title> <xsl:value-of select="@title"/> </o:Title> </o:DocumentProperties> <w:styles> <w:style w:type="paragraph" w:styleId="Heading3"> <w:name w:val="heading 3"/> <w:pPr> <w:pStyle w:val="Heading3"/> <w:keepNext/> <w:spacing w:before="240" w:after="60"/> <w:outlineLvl w:val="2"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/> <w:b/> <w:sz w:val="26"/> </w:rPr> </w:style> <w:style w:type="character" w:styleId="Hyperlink"> <w:rPr> <w:color w:val="0000FF"/> <w:u w:val="single"/> </w:rPr> </w:style> </w:styles> <w:body> <w:p> <w:pPr> <w:pStyle w:val="Heading3"/> </w:pPr> <w:r> <w:t> <xsl:value-of select="@title"/> </w:t> </w:r> </w:p> <xsl:apply-templates/> </w:body> </xsl:template> <xsl:template match="para"> <w:p> <xsl:apply-templates/> </w:p> </xsl:template> <xsl:template match="i"> <w:r> <w:rPr> <w:i/> </w:rPr> <xsl:apply-templates/> </w:r> </xsl:template> <xsl:template match="text()"> <w:r> <w:t xml:space="preserve"><xsl:value-of select="."/></w:t> </w:r> </xsl:template> <xsl:template match="link"> <w:hlink w:dest="{@url}"> <w:r> <w:rPr> <w:rStyle w:val="Hyperlink"/> <w:i/> </w:rPr> <xsl:apply-templates/> </w:r> </w:hlink> </xsl:template> </xsl:stylesheet>And the resulting WordML document, opened in Word 2003:
![Generated Word Document](https://i-blog.csdnimg.cn/blog_migrate/8d48274a925c59c59c8f8da2f74d0c08.jpeg)