我正在创建一个Excel文档,其中单元格中的某些文本将以不同的颜色或粗体格式化。
例如我的电子表格应该是这样的:
我要格式化的文本在我的XML中有标签,例如<strong>
。我编写了一个函数来获取这些标记并替换它们
颜色或粗体格式,例如创建xml输出以在excel中打开时<Font html:color="#0000FF"> text </Font>
。
问题是,当打开电子表格时,文本不会着色,而是由格式化命令<Font html:color="#0000FF">
包围:
这是我的输入XML
<?xml version="1.0" encoding="UTF-8"?>
<analysis>
<datasetList>
<dataset>
<datasetLabel>Subject Level Analysis</datasetLabel>
<datasetName>ADSL</datasetName>
<datasetOrdinal>1</datasetOrdinal>
<datasetStructure>One record per subject</datasetStructure>
<datasetContext>
<datasetClass>
<datasetClass>ADSL</datasetClass>
</datasetClass>
</datasetContext>
<columnList>
<column>
<columnLabel>Analysis Visit</columnLabel>
<columnName>AVISIT</columnName>
<columnDerivationList>
<columnDerivation>
<columnDerivationDescription>Set to collected visit name [EG.VISIT] <keepordrop>Set to 'POST-BASELINE MINIMUM'</keepordrop></columnDerivationDescription>
</columnDerivation>
<columnDerivation>
<columnDerivationDescription>Set to a re-defined visit range based on user-defined input. <strong>Set to 'POST-BASELINE MINIMUM'</strong></columnDerivationDescription>
</columnDerivation>
</columnDerivationList>
</column>
<column>
<columnLabel>Analysis Visit (N)</columnLabel>
<columnName>AVISITN</columnName>
<columnDerivationList>
<columnDerivation>
<columnDerivationDescription>Set to collected <edit>Set to 9997</edit></columnDerivationDescription>
</columnDerivation>
<columnDerivation>
<columnDerivationDescription>Set to a user defined numeric value <select>Set to 9997 wih the analysis visit </select></columnDerivationDescription>
</columnDerivation>
</columnDerivationList>
</column>
</columnList>
</dataset>
</datasetList>
</analysis>
这是我完整的XSLT
<?xml version="1.0" encoding="UTF-8"?>
<?mso-application progid="Excel.Sheet"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:gdsr="http://somethinghere.com" >
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<!--
***************************************************************************************
START OF WORKBOOK LAYOUT
***************************************************************************************
-->
<xsl:template match="/" >
<xsl:processing-instruction name="mso-application">progid="Excel.Sheet"</xsl:processing-instruction>
<ss:Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
<xsl:call-template name="document-properties"/>
<xsl:call-template name="document-styles"/>
<!-- ****************************************************************************************** -->
<!-- CREATE THE TABS IN THE WORKBOOK -->
<!-- ****************************************************************************************** -->
<xsl:call-template name="getDset"/>
<!-- ****************************************************************************************** -->
</ss:Workbook>
</xsl:template>
<!-- TEMPLATE FOR DATASET -->
<xsl:template name="getDset">
<xsl:for-each select="//dataset">
<ss:Worksheet ss:Name="{.//datasetName}"><!-- Add filters to the columns -->
<Names>
<NamedRange ss:Name="_FilterDatabase" ss:RefersTo="={.//datasetName}!R1C1:R1C2" ss:Hidden="1"/>
</Names>
<ss:Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="200" x:FullColumns="1" x:FullRows="1" ss:DefaultRowHeight="30">
<Column ss:Width="70"/>
<Column ss:Width="70"/>
<Row>
<Cell ss:StyleID="sHead">
<Data ss:Type="String">
Header1
</Data>
<NamedCell ss:Name="_FilterDatabase"/>
</Cell>
<Cell ss:StyleID="sHead">
<Data ss:Type="String">
Header2
</Data>
<NamedCell ss:Name="_FilterDatabase"/>
</Cell>
</Row>
<xsl:for-each select="columnList/column">
<xsl:if test="columnName !=' ' ">
<Row>
<Cell ss:StyleID="sBody" >
<Data ss:Type="String">
<xsl:value-of select="columnName"/>
</Data>
</Cell>
<!-- SET COLOR OF TEXT WHEN TAGGED -->
<xsl:variable name="columnDerivationDescription">
<xsl:value-of select="columnDerivationList/columnDerivation/columnDerivationDescription"/>
</xsl:variable>
<xsl:variable name="columnDerivationDescription1">
<xsl:value-of select="gdsr:set-font($columnDerivationDescription)"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="contains($columnDerivationDescription1, 'Font')">
<Cell ss:StyleID="sBody">
<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
<xsl:for-each select="columnDerivationList/columnDerivation">
<xsl:if test="columnDerivationDescription !=' ' ">
<xsl:call-template name="LFsToBRs">
<xsl:with-param name="input" select="gdsr:set-font(columnDerivationDescription)"/>
</xsl:call-template>
</xsl:if>
</xsl:for-each>
</ss:Data>
</Cell>
</xsl:when>
<xsl:otherwise>
<Cell ss:StyleID="sBody">
<Data ss:Type="String">
<xsl:for-each select="columnDerivationList/columnDerivation">
<xsl:if test="columnDerivationDescription !=' ' ">
<xsl:call-template name="LFsToBRs">
<xsl:with-param name="input" select="columnDerivationDescription"/>
</xsl:call-template>
</xsl:if>
</xsl:for-each>
</Data>
</Cell>
</xsl:otherwise>
</xsl:choose>
<!-- COLOUR TAGGED. NICELY DONE -->
</Row>
</xsl:if>
</xsl:for-each>
</ss:Table>
<xsl:call-template name="worksheet-options"/>
<AutoFilter x:Range="R1C1:R1C2" xmlns="urn:schemas-microsoft-com:office:excel"/>
</ss:Worksheet>
</xsl:for-each>
</xsl:template>
<!--FUNCTIONS-->
<xsl:function name="gdsr:set-font">
<xsl:param name="text"/>
<xsl:variable name="blue-font"><Font html:color="#0000FF"></xsl:variable>
<xsl:variable name="blue-font-end"><xsl:text disable-output-escaping="no"></Font></xsl:text></xsl:variable>
<xsl:variable name="pink-font"><Font html:color="#7030A0"></xsl:variable>
<xsl:variable name="pink-font-end"><xsl:text disable-output-escaping="no"></Font></xsl:text></xsl:variable>
<xsl:variable name="var-1" select="replace($text,'<select>',$blue-font)"/>
<xsl:variable name="var-2" select="replace($var-1,'</select>',$blue-font-end)"/>
<xsl:variable name="var-3" select="replace($var-2,'<strong>','<b>')"/>
<xsl:variable name="var-4" select="replace($var-3,'</strong>','</b>')"/>
<xsl:variable name="var-5" select="replace($var-4,'<keepordrop>',$pink-font)"/>
<xsl:variable name="var-6" select="replace($var-5,'</keepordrop>',$pink-font-end)"/>
<xsl:variable name="var-7" select="replace($var-6,'<edit>',$blue-font)"/>
<xsl:variable name="var-8" select="replace($var-7,'</edit>',$blue-font-end)"/>
<xsl:variable name="var-81" select="replace($var-8,'<select><option>',$blue-font)"/>
<xsl:variable name="var-82" select="replace($var-81,'</option><option>','BLUEFONTENDOP1 | BLUEFONTSTARTOP2')"/>
<xsl:variable name="var-83" select="replace($var-82,'BLUEFONTENDOP1',$blue-font-end)"/>
<xsl:variable name="var-84" select="replace($var-83,'BLUEFONTSTARTOP2',$blue-font)"/>
<xsl:variable name="var-85" select="replace($var-84,'</option></select>',$blue-font-end)"/>
<xsl:variable name="var-9">
<xsl:analyze-string select="$var-85"
regex="({$blue-font})(.*?)({$blue-font-end}|{$blue-font})">
<xsl:matching-substring>
<xsl:choose>
<xsl:when test="regex-group(3)=$blue-font-end">
<xsl:value-of select="regex-group(0)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="regex-group(1)"/>
<xsl:value-of select="regex-group(2)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:variable>
<xsl:variable name="var-10">
<xsl:analyze-string select="$var-9"
regex="({$blue-font-end})(.*?)({$blue-font-end}|{$blue-font})">
<xsl:matching-substring>
<xsl:choose>
<xsl:when test="regex-group(3)=$blue-font">
<xsl:value-of select="regex-group(0)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="regex-group(2)"/>
<xsl:value-of select="regex-group(3)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:variable>
<xsl:value-of select="$var-10"/>
</xsl:function>
<!--
*************************************GENERAL TEMPLATES**************************************************
-->
<xsl:template name="LFsToBRs">
<xsl:param name="input"/>
<xsl:choose>
<xsl:when test="contains($input, ' ')">
<xsl:value-of select="substring-before($input, ' ')"/>
<xsl:text disable-output-escaping="yes">&#10;</xsl:text>
<xsl:call-template name="LFsToBRs">
<xsl:with-param name="input" select="substring-after($input, ' ')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$input"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- EXCEL WORKSHEET OPTIONS -->
<xsl:template name="worksheet-options">
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<PageSetup>
<Header x:Margin="0.3"/>
<Footer x:Margin="0.3"/>
<PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
</PageSetup>
<Selected/>
<FreezePanes/>
<FrozenNoSplit/>
<SplitHorizontal>1</SplitHorizontal>
<TopRowBottomPane>1</TopRowBottomPane>
<ActivePane>2</ActivePane>
<Panes>
<Pane>
<Number>3</Number>
<ActiveRow>18</ActiveRow>
<ActiveCol>2</ActiveCol>
</Pane>
</Panes>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</xsl:template>
<!-- EXCEL DOCUMENT PROPERTIES -->
<xsl:template name="document-properties">
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
<Author>Mason, Huw {MDBZ~Basel}</Author>
<LastAuthor>Mason, Huw {MDBZ~Basel}</LastAuthor>
<Created></Created>
<Company></Company>
<Version>1</Version>
</DocumentProperties>
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
<WindowHeight>14370</WindowHeight>
<WindowWidth>27795</WindowWidth>
<WindowTopX>480</WindowTopX>
<WindowTopY>120</WindowTopY>
<ProtectStructure>False</ProtectStructure>
<ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>
</xsl:template>
<!-- EXCEL DOCUMENT STYLES -->
<xsl:template name="document-styles">
<ss:Styles>
<ss:Style ss:ID="Default" ss:Name="Normal">
<ss:Alignment ss:Vertical="Bottom" ss:WrapText="1"/>
<ss:Borders/>
<ss:Font ss:FontName="Arial" x:Family="Swiss" ss:Size="10" ss:Color="#000000"/>
<ss:Interior/>
<ss:NumberFormat/>
<ss:Protection/>
</ss:Style><!-- **STYLES CREATED TO REF LATER ON e.g. STYLE FOR COL HEADER**-->
<ss:Style ss:ID="sHead">
<Alignment ss:Horizontal="Center" ss:Vertical="Top" ss:WrapText="1"/>
<ss:Borders>
<ss:Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<ss:Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<ss:Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<ss:Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</ss:Borders>
<Font ss:FontName="Arial" x:Family="Swiss" ss:Size="9" ss:Color="#FFFFFF"/>
<ss:Interior ss:Color="#538DD5" ss:Pattern="Solid"/>
</ss:Style>
<ss:Style ss:ID="sHeadAC">
<Alignment ss:Horizontal="Center" ss:Vertical="Top" ss:WrapText="1"/>
<ss:Borders>
<ss:Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<ss:Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<ss:Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<ss:Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</ss:Borders>
<Font ss:FontName="Arial" x:Family="Swiss" ss:Size="9" ss:Color="#000000"/>
<ss:Interior ss:Color="#FFFF66" ss:Pattern="Solid"/>
</ss:Style>
<ss:Style ss:ID="sHeadCT">
<Alignment ss:Horizontal="Center" ss:Vertical="Top" ss:WrapText="1"/>
<ss:Borders>
<ss:Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<ss:Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<ss:Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<ss:Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</ss:Borders>
<Font ss:FontName="Arial" x:Family="Swiss" ss:Size="9" ss:Color="#FFFFFF"/>
<ss:Interior ss:Color="#FF9900" ss:Pattern="Solid"/>
</ss:Style>
<ss:Style ss:ID="sHeadGD">
<Alignment ss:Horizontal="Center" ss:Vertical="Top" ss:WrapText="1"/>
<ss:Borders>
<ss:Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<ss:Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<ss:Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<ss:Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</ss:Borders>
<Font ss:FontName="Arial" x:Family="Swiss" ss:Size="9" ss:Color="#DA9694"/>
<ss:Interior ss:Color="#000000" ss:Pattern="Solid"/>
</ss:Style>
<ss:Style ss:ID="sHeadPRM">
<Alignment ss:Horizontal="Center" ss:Vertical="Top" ss:WrapText="1"/>
<ss:Borders>
<ss:Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<ss:Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<ss:Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<ss:Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</ss:Borders>
<Font ss:FontName="Arial" x:Family="Swiss" ss:Size="9" ss:Color="#FFFFFF"/>
<ss:Interior ss:Color="#92D050" ss:Pattern="Solid"/>
</ss:Style>
<ss:Style ss:ID="sHeadALG">
<Alignment ss:Horizontal="Center" ss:Vertical="Top" ss:WrapText="1"/>
<ss:Borders>
<ss:Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<ss:Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<ss:Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<ss:Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</ss:Borders>
<Font ss:FontName="Arial" x:Family="Swiss" ss:Size="9" ss:Color="#FFFFFF"/>
<ss:Interior ss:Color="#92D050" ss:Pattern="Solid"/>
</ss:Style>
<ss:Style ss:ID="sBody">
<Alignment ss:Horizontal="Left" ss:Vertical="Top" ss:WrapText="1"/>
<ss:Borders>
<ss:Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<ss:Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<ss:Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<ss:Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</ss:Borders>
<ss:Interior ss:Pattern="Solid"/>
</ss:Style>
<Style ss:ID="SHyperlink" ss:Name="Hyperlink">
<Alignment ss:Horizontal="Left" ss:Vertical="Top" ss:WrapText="1"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Arial" x:Family="Swiss" ss:Size="10" ss:Color="#0000FF" ss:Underline="Single"/>
</Style>
</ss:Styles>
</xsl:template>
</xsl:stylesheet>
以下是我的输出XML
的示例<Row>
<Cell ss:StyleID="sBody">
<Data ss:Type="String">AVISIT</Data>
</Cell>
<Cell ss:StyleID="sBody">
<ss:Data xmlns="http://www.w3.org/TR/REC-html40" ss:Type="String">Set to collected visit name [EG.VISIT] <Font html:color="#7030A0">Set to 'POST-BASELINE MINIMUM'</Font>Set to a re-defined visit range based on user-defined input. <b>Set to 'POST-BASELINE MINIMUM'</b></ss:Data>
</Cell>
</Row>
<Row>
<Cell ss:StyleID="sBody">
<Data ss:Type="String">AVISITN</Data>
</Cell>
<Cell ss:StyleID="sBody">
<ss:Data xmlns="http://www.w3.org/TR/REC-html40" ss:Type="String">Set to collected <Font html:color="#0000FF">Set to 9997</Font>Set to a user defined numeric value <Font html:color="#0000FF">Set to 9997 wih the analysis visit </Font></ss:Data>
</Cell>
</Row>
我已经创建了一个xsl并保存为XML电子表格2003以检查代码并且符合预期。当我替换&lt; &GT;使用<
和>
我遇到了输出
我不知道是否与使用<
而不是&lt;在创建xml时。有没有人有类似的问题并解决了它?或者可以看出我的问题所在?
编辑:
我已经对XSLT公司进行了更新。正如Martin所建议的那样,html命名空间。这就像我期望的那样创建XML并且看起来很好。
现在的问题是,当在excel中打开时,格式化不会显示,我会得到纯黑色文本。
我已经创建了一个示例,它应该看起来并保存为XML电子表格2003,以比较两者,它们是相同的。 有趣的是:如果我从excel创建的示例中复制代码并将其粘贴到xslt创建的XML中,然后在excel中打开它,格式化工作。 如果我从xslt创建的xml中复制代码并将其粘贴到我的excel创建的示例中(确实可以正常工作),现在格式化不再有效。
excel创建值的XML代码
<Row ss:AutoFitHeight="0">
<Cell ss:StyleID="s64"><Data ss:Type="String">AVISIT</Data></Cell>
<Cell ss:StyleID="s65"><ss:Data ss:Type="String"
xmlns="http://www.w3.org/TR/REC-html40">Set to collected visit name [EG.VISIT] <Font
html:Color="#7030A0">Set to 'POST-BASELINE MINIMUM'</Font>Set to a re-defined visit range based on user-defined input. <B>Set to 'POST-BASELINE MINIMUM'</B></ss:Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell ss:StyleID="s64"><Data ss:Type="String">AVISITN</Data></Cell>
<Cell ss:StyleID="s65"><ss:Data ss:Type="String"
xmlns="http://www.w3.org/TR/REC-html40">Set to collected <Font
html:Color="#0000FF">Set to 9997</Font>Set to a user defined numeric value<Font
html:Color="#0000FF">Set to 9997 wih the analysis visit</Font></ss:Data></Cell>
</Row>
这是我的XSLT创建的xml的外观:
<Row>
<Cell ss:StyleID="sBody">
<Data ss:Type="String">AVISIT</Data>
</Cell>
<Cell ss:StyleID="sBody">
<ss:Data xmlns="http://www.w3.org/TR/REC-html40" ss:Type="String">Set to collected visit name [EG.VISIT] <Font html:Color="#7030A0">Set to 'POST-BASELINE MINIMUM'</Font>Set to a re-defined visit range based on user-defined input. <B>Set to 'POST-BASELINE MINIMUM'</B>
</ss:Data>
</Cell>
</Row>
<Row>
<Cell ss:StyleID="sBody">
<Data ss:Type="String">AVISITN</Data>
</Cell>
<Cell ss:StyleID="sBody">
<ss:Data xmlns="http://www.w3.org/TR/REC-html40" ss:Type="String">Set to collected <Font html:Color="#0000FF">Set to 9997</Font>Set to a user defined numeric value <Font html:Color="#0000FF">Set to 9997 wih the analysis visit </Font>
</ss:Data>
</Cell>
</Row>
所以尽管xml代码是相同的,但取决于它是如何创建的,定义它是否有效。
问题: 可能有一些编码差异可以解释这种行为吗?
答案 0 :(得分:0)
以下是使用parse-xml-fragment
(https://www.w3.org/TR/xpath-functions-31/#func-parse-xml-fragment(在您的XSLT中使用version="3.0"
时在Saxon 9.7(所有版本)中提供)然后使用模板转换元素时如何解决问题的方法你有columnDerivationDescription
元素中的转义标记:
<xsl:template name="getDset">
<xsl:for-each select="//dataset">
<ss:Worksheet ss:Name="{.//datasetName}"><!-- Add filters to the columns -->
<Names>
<NamedRange ss:Name="_FilterDatabase" ss:RefersTo="={.//datasetName}!R1C1:R1C2" ss:Hidden="1"/>
</Names>
<ss:Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="200" x:FullColumns="1" x:FullRows="1" ss:DefaultRowHeight="30">
<Column ss:Width="70"/>
<Column ss:Width="70"/>
<Row>
<Cell ss:StyleID="sHead">
<Data ss:Type="String">
Header1
</Data>
<NamedCell ss:Name="_FilterDatabase"/>
</Cell>
<Cell ss:StyleID="sHead">
<Data ss:Type="String">
Header2
</Data>
<NamedCell ss:Name="_FilterDatabase"/>
</Cell>
</Row>
<xsl:for-each select="columnList/column">
<xsl:if test="columnName !=' ' ">
<Row>
<Cell ss:StyleID="sBody" >
<Data ss:Type="String">
<xsl:value-of select="columnName"/>
</Data>
</Cell>
<!-- SET COLOR OF TEXT WHEN TAGGED -->
<Cell ss:StyleID="sBody">
<Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
<xsl:apply-templates select="columnDerivationList/columnDerivation/columnDerivationDescription"/>
</Data>
</Cell>
<!-- COLOUR TAGGED. NICELY DONE -->
</Row>
</xsl:if>
</xsl:for-each>
</ss:Table>
<xsl:call-template name="worksheet-options"/>
<AutoFilter x:Range="R1C1:R1C2" xmlns="urn:schemas-microsoft-com:office:excel"/>
</ss:Worksheet>
</xsl:for-each>
</xsl:template>
<xsl:template match="columnDerivationDescription">
<xsl:apply-templates select="parse-xml-fragment(.)/node()"/>
</xsl:template>
<xsl:template match="strong">
<b>
<xsl:apply-templates/>
</b>
</xsl:template>
<xsl:template match="edit">
<Font html:color="#0000FF">
<xsl:apply-templates/>
</Font>
</xsl:template>
<!-- add further templates here for the other elements and transformations you need -->