Server : Apache/2.4.43 (Win64) OpenSSL/1.1.1g PHP/7.4.6 System : Windows NT USER-PC 6.1 build 7601 (Windows 7 Professional Edition Service Pack 1) AMD64 User : User ( 0) PHP Version : 7.4.6 Disable Function : NONE Directory : C:/Program Files (x86)/Microsoft Office/OFFICE11/ |
<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" exclude-result-prefixes="xsi"> <xsl:variable name="dxaIndent" select="'360'" /> <xsl:template match="/"> <xsl:variable name="currentSpacePreserve"> <xsl:value-of select="/*/@xml:space"/> </xsl:variable> <w:wordDocument> <xsl:if test="$currentSpacePreserve != ''"> <xsl:attribute name="xml:space"> <xsl:value-of select="$currentSpacePreserve"/> </xsl:attribute> </xsl:if> <!-- save processing instructions as custom document properties in order to preserve them on save --> <xsl:if test="processing-instruction()"> <o:CustomDocumentProperties> <xsl:element name="o:processingInstructions"> <xsl:attribute name="dt:dt">string</xsl:attribute> <xsl:apply-templates select="processing-instruction()" mode="piMode" /> </xsl:element> </o:CustomDocumentProperties> </xsl:if> <!-- check for schemaLocation attributes in the file - if they exist, convert them to schema library entries (so we can attach them if possible) --> <xsl:if test="//@xsi:schemaLocation"> <sl:schemaLibrary> <xsl:for-each select="//@xsi:schemaLocation"> <xsl:call-template name="schemaLocationTransform"> <xsl:with-param name="schemaLocationString" select="." /> </xsl:call-template> </xsl:for-each> </sl:schemaLibrary> </xsl:if> <!-- set Word document properties for raw XML - save as raw XML and show XML tags in the document --> <w:docPr> <w:view w:val="web" /> <w:removeWordSchemaOnSave w:val="on" /> <w:showXMLTags w:val="on" /> </w:docPr> <!-- insert the body tags for the Word document, and begin processing the file's content --> <w:body> <xsl:apply-templates> <xsl:with-param name="spacePreserve" select="$currentSpacePreserve"/> </xsl:apply-templates> </w:body> </w:wordDocument> </xsl:template> <xsl:template match="*"> <xsl:param name="spacePreserve" select="default"/> <!-- first, set the depth (in twips) for the current indent level --> <xsl:variable name="depth"> <xsl:choose> <xsl:when test="count(ancestor::node()) * $dxaIndent >= 4320"> <xsl:value-of select="4320" /> </xsl:when> <xsl:otherwise> <xsl:value-of select="$dxaIndent*count(ancestor::node()) - $dxaIndent" /> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="currentSpacePreserve"> <xsl:choose> <xsl:when test="@xml:space"> <xsl:value-of select="@xml:space" /> </xsl:when> <xsl:otherwise> <xsl:value-of select="$spacePreserve" /> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:copy> <xsl:copy-of select="@*" /> <xsl:choose> <xsl:when test="count(node())=0"> <!-- processing a leaf node with no children --> <w:p> <w:pPr> <w:ind> <xsl:attribute name="w:left"> <xsl:value-of select="$depth" /> </xsl:attribute> </w:ind> </w:pPr> </w:p> </xsl:when> <xsl:when test="count(node())=1"> <!-- processing a node with one child node --> <xsl:choose> <xsl:when test="generate-id(child::node()[1])=generate-id(child::text()[1])"> <!-- if the first node is a text node, their id's will be the same, therefore this node has a single child, and it's text --> <xsl:apply-templates mode="leafNode"> <xsl:with-param name="spacePreserve" select="$currentSpacePreserve"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <!-- otherwise, this node has a single child, and it's NOT text --> <w:p> <w:pPr> <w:ind> <xsl:attribute name="w:left"> <xsl:value-of select="$depth" /> </xsl:attribute> </w:ind> </w:pPr> </w:p> <xsl:apply-templates> <xsl:with-param name="spacePreserve" select="$currentSpacePreserve"/> </xsl:apply-templates> <w:p> <w:pPr> <w:ind> <xsl:attribute name="w:left"> <xsl:value-of select="$depth" /> </xsl:attribute> </w:ind> </w:pPr> </w:p> </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:otherwise> <!-- processing a node with multiple children --> <w:p> <w:pPr> <w:ind> <xsl:attribute name="w:left"> <xsl:value-of select="$depth" /> </xsl:attribute> </w:ind> </w:pPr> </w:p> <xsl:apply-templates> <xsl:with-param name="spacePreserve" select="$currentSpacePreserve"/> </xsl:apply-templates> <w:p> <w:pPr> <w:ind> <xsl:attribute name="w:left"> <xsl:value-of select="$depth" /> </xsl:attribute> </w:ind> </w:pPr> </w:p> </xsl:otherwise> </xsl:choose> </xsl:copy> </xsl:template> <xsl:template match="w:* | v:* | w10:* | sl:* | aml:* | wx:* | o:* | dt:*"> <xsl:param name="spacePreserve" select="default"/> <xsl:variable name="currentSpacePreserve"> <xsl:choose> <xsl:when test="@xml:space"> <xsl:value-of select="@xml:space" /> </xsl:when> <xsl:otherwise> <xsl:value-of select="$spacePreserve" /> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:apply-templates> <xsl:with-param name="spacePreserve" select="$currentSpacePreserve"/> </xsl:apply-templates> </xsl:template> <xsl:template match="text()"> <xsl:param name="spacePreserve" select="default"/> <!-- first, set the depth (in twips) for the current indent level --> <xsl:variable name="depth"> <xsl:choose> <xsl:when test="count(ancestor::node()) * $dxaIndent >= 4320"> <xsl:value-of select="4320" /> </xsl:when> <xsl:otherwise> <xsl:value-of select="$dxaIndent*count(ancestor::node())-$dxaIndent" /> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="currentSpacePreserve"><xsl:value-of select="$spacePreserve" /></xsl:variable> <!-- processing a non-leaf text node, set the indent spacing --> <w:p> <w:pPr> <w:ind> <xsl:attribute name="w:left"> <xsl:value-of select="$depth" /> </xsl:attribute> </w:ind> </w:pPr> <w:r> <w:t> <xsl:if test="$currentSpacePreserve != ''"> <xsl:attribute name="xml:space"> <xsl:value-of select="$currentSpacePreserve"/> </xsl:attribute> </xsl:if> <xsl:value-of select="." /> </w:t> </w:r> </w:p> </xsl:template> <xsl:template match="text()" mode="leafNode"> <xsl:param name="spacePreserve" select="default"/> <!-- first, set the depth (in twips) for the current indent level --> <xsl:variable name="depth"> <xsl:choose> <xsl:when test="count(ancestor::node()) * dxaIndent >= 4320"> <xsl:value-of select="4320" /> </xsl:when> <xsl:otherwise> <xsl:value-of select="$dxaIndent*count(ancestor::node()) - $dxaIndent * 2" /> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="currentSpacePreserve"><xsl:value-of select="$spacePreserve" /></xsl:variable> <!-- processing a leaf text node, set the indent spacing to account for the parent tag on the same line --> <w:p> <w:pPr> <w:ind> <xsl:attribute name="w:left"> <xsl:value-of select="$depth" /> </xsl:attribute> </w:ind> </w:pPr> <w:r> <w:t> <xsl:if test="$currentSpacePreserve != ''"> <xsl:attribute name="xml:space"> <xsl:value-of select="$currentSpacePreserve"/> </xsl:attribute> </xsl:if> <xsl:value-of select="." /> </w:t> </w:r> </w:p> </xsl:template> <!-- we will copy the contents of PI's into custom document properties exactly as they were --> <xsl:template match="processing-instruction()" mode="piMode"><?<xsl:value-of select="local-name()" /> <xsl:value-of select="." />?></xsl:template> <!-- We will recursively call this function. It will go through each entry in the xsi:schemaLocation attribute --> <xsl:template name="schemaLocationTransform"> <xsl:param name="schemaLocationString" /> <xsl:variable name="schemaLocationStringNormalized"> <xsl:value-of select="normalize-space($schemaLocationString)" /> </xsl:variable> <xsl:variable name="schemaLocationStringAfterURI"> <xsl:value-of select="substring-after($schemaLocationStringNormalized, ' ')" /> </xsl:variable> <xsl:variable name="schemaLocationStringAfterLocation"> <xsl:value-of select="substring-after($schemaLocationStringAfterURI, ' ')" /> </xsl:variable> <sl:schema> <xsl:attribute name="sl:uri"> <xsl:value-of select="substring-before($schemaLocationStringNormalized, ' ')" /> </xsl:attribute> <xsl:attribute name="sl:schemaLocation"> <xsl:if test="contains($schemaLocationStringAfterURI, ' ')"> <xsl:value-of select="substring-before($schemaLocationStringAfterURI, ' ')" /> </xsl:if> <xsl:if test="not(contains($schemaLocationStringAfterURI, ' '))"> <xsl:value-of select="$schemaLocationStringAfterURI" /> </xsl:if> </xsl:attribute> </sl:schema> <xsl:if test="contains($schemaLocationStringAfterLocation, ' ')"> <xsl:call-template name="schemaLocationTransform"> <xsl:with-param name="schemaLocationString" select="$schemaLocationStringAfterLocation" /> </xsl:call-template> </xsl:if> </xsl:template> </xsl:stylesheet>