XSLT XML เป็น Excel ในการจัดรูปแบบข้อความเซลล์

ฉันกำลังสร้างเอกสาร Excel โดยที่ข้อความภายในเซลล์จะถูกจัดรูปแบบด้วยสีอื่นหรือตัวหนา

ตัวอย่างเช่น สเปรดชีตของฉันควรเป็นดังนี้: .

ข้อความที่ฉันต้องการจัดรูปแบบมีแท็กล้อมรอบใน XML ของฉันเช่น &lt;strong>. ฉันได้เขียนฟังก์ชันที่รับแท็กเหล่านี้และแทนที่ด้วยสีหรือการจัดรูปแบบตัวหนา เช่น <Font html:color="#0000FF"> text </Font> เมื่อสร้างเอาต์พุต xml เพื่อเปิดใน Excel

ปัญหาคือเมื่อเปิดสเปรดชีต ข้อความจะไม่มีสี แต่ล้อมรอบด้วยคำสั่งการจัดรูปแบบ <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] &lt;keepordrop>Set to 'POST-BASELINE MINIMUM'&lt;/keepordrop></columnDerivationDescription>                     
                  </columnDerivation>
                  <columnDerivation>                     
                     <columnDerivationDescription>Set to a re-defined visit range based on user-defined input. &lt;strong>Set to 'POST-BASELINE MINIMUM'&lt;/strong></columnDerivationDescription>
                  </columnDerivation>
               </columnDerivationList>
            </column>
            <column>
               <columnLabel>Analysis Visit (N)</columnLabel>              
               <columnName>AVISITN</columnName>               
               <columnDerivationList>
                  <columnDerivation>                     
                     <columnDerivationDescription>Set to collected &lt;edit>Set to 9997&lt;/edit></columnDerivationDescription>
                  </columnDerivation>
                  <columnDerivation>                     
                     <columnDerivationDescription>Set to a user defined numeric value &lt;select>Set to 9997 wih the analysis visit &lt;/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">&lt;Font  html:color="#0000FF"&gt;</xsl:variable>
        <xsl:variable name="blue-font-end"><xsl:text disable-output-escaping="no">&lt;/Font&gt;</xsl:text></xsl:variable>


        <xsl:variable name="pink-font">&lt;Font  html:color="#7030A0"&gt;</xsl:variable>
        <xsl:variable name="pink-font-end"><xsl:text disable-output-escaping="no">&lt;/Font&gt;</xsl:text></xsl:variable>

        <xsl:variable name="var-1" select="replace($text,'&lt;select&gt;',$blue-font)"/>
        <xsl:variable name="var-2" select="replace($var-1,'&lt;/select&gt;',$blue-font-end)"/>

        <xsl:variable name="var-3" select="replace($var-2,'&lt;strong&gt;','&lt;b&gt;')"/>
        <xsl:variable name="var-4" select="replace($var-3,'&lt;/strong&gt;','&lt;/b&gt;')"/>

        <xsl:variable name="var-5" select="replace($var-4,'&lt;keepordrop&gt;',$pink-font)"/>
        <xsl:variable name="var-6" select="replace($var-5,'&lt;/keepordrop&gt;',$pink-font-end)"/>

        <xsl:variable name="var-7" select="replace($var-6,'&lt;edit&gt;',$blue-font)"/>
        <xsl:variable name="var-8" select="replace($var-7,'&lt;/edit&gt;',$blue-font-end)"/>

        <xsl:variable name="var-81" select="replace($var-8,'&lt;select&gt;&lt;option&gt;',$blue-font)"/>
        <xsl:variable name="var-82" select="replace($var-81,'&lt;/option&gt;&lt;option&gt;','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,'&lt;/option&gt;&lt;/select&gt;',$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, '&#10;')">
                <xsl:value-of select="substring-before($input, '&#10;')"/> 
                <xsl:text disable-output-escaping="yes">&amp;#10;</xsl:text>      
                <xsl:call-template name="LFsToBRs">
                    <xsl:with-param name="input" select="substring-after($input, '&#10;')"/>
                </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] &lt;Font  html:color="#7030A0"&gt;Set to 'POST-BASELINE MINIMUM'&lt;/Font&gt;Set to a re-defined visit range based on user-defined input. &lt;b&gt;Set to 'POST-BASELINE MINIMUM'&lt;/b&gt;</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 &lt;Font  html:color="#0000FF"&gt;Set to 9997&lt;/Font&gt;Set to a user defined numeric value &lt;Font  html:color="#0000FF"&gt;Set to 9997 wih the analysis visit &lt;/Font&gt;</ss:Data>
            </Cell>
         </Row>

ฉันได้สร้าง xsl และบันทึกเป็นสเปรดชีต XML 2003 เพื่อตรวจสอบโค้ดและเป็นไปตามที่คาดไว้ เมื่อฉันแทนที่ ‹ > ด้วย &lt; และ &gt; ฉันพบปัญหาที่ฉันกำลังประสบกับผลลัพธ์ของฉัน

ฉันไม่รู้ว่าเกี่ยวข้องกับการใช้ &lt; แทนที่จะเป็น ‹ เมื่อสร้าง xml หรือไม่ มีใครมีปัญหาที่คล้ายกันและแก้ไขได้หรือไม่ หรือสามารถดูว่าปัญหาของฉันอยู่ที่ไหน?

แก้ไข:

ฉันได้อัปเดต XSLT inc แล้ว เนมสเปซ html ตามที่ Martin แนะนำ สิ่งนี้จะสร้าง XML อย่างที่ฉันคาดหวังและดูดี

ปัญหาตอนนี้คือเมื่อเปิดใน Excel แล้วการจัดรูปแบบไม่แสดงขึ้น ฉันได้รับข้อความสีดำล้วน

เอาต์พุตโดยไม่มีการจัดรูปแบบ

ฉันได้สร้างตัวอย่างสิ่งที่ควรดูและบันทึกเป็น XML สเปรดชีต 2003 เพื่อเปรียบเทียบทั้งสองและเหมือนกัน สิ่งที่น่าสนใจ: ถ้าฉันคัดลอกโค้ดจากตัวอย่างที่สร้างด้วย Excel และวางลงใน XML ที่สร้าง xslt แล้วเปิดใน Excel การจัดรูปแบบก็จะใช้งานได้ หากฉันคัดลอกโค้ดจาก xslt ที่สร้าง xml และวางลงในตัวอย่างที่สร้างด้วย Excel (ซึ่งทำงานได้ดี) การจัดรูปแบบในขณะนี้จะไม่ทำงานอีกต่อไป

ตัวอย่างที่สร้างโดย Excel

รหัส XML ของค่าที่ Excel สร้างขึ้น

   <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>

นี่คือลักษณะของ xml ที่สร้างโดย XSLT ของฉัน:

<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 จะเหมือนกันก็ตาม ขึ้นอยู่กับวิธีการสร้างโค้ดว่าจะใช้งานได้หรือไม่

คำถาม: อาจมีความแตกต่างในการเข้ารหัสที่อาจอธิบายพฤติกรรมนี้ได้หรือไม่


person Huw    schedule 10.08.2016    source แหล่งที่มา
comment
ฉันจะเริ่มต้นด้วยการสร้างสิ่งที่คุณต้องการดูใน Excel ด้วยตนเอง จากนั้นส่งออกเป็น XML เพื่อดูว่า Excel ต้องการอะไร จากนั้นจึงสร้างสิ่งนั้นใน XSLT ของคุณ   -  person Jim Garrison    schedule 10.08.2016
comment
นั่นเป็นโค้ดจำนวนมาก แต่ฟังก์ชันที่ส่งคืนโหนดข้อความด้วย xsl:value-of จะไม่สร้างองค์ประกอบ font แน่นอน สำหรับแนวทางทั้งหมด เมื่อคุณใช้ XSLT 2.0 อยู่แล้ว คุณใช้โปรเซสเซอร์ XSLT ตัวใดกันแน่ การใช้ Saxon 9 รุ่น 9.7 (แม้แต่รุ่น HE) คุณอาจสามารถเปลี่ยนไปใช้ XSLT 3.0 แล้วใช้ w3.org/TR/xpath-functions-31/#func-parse-xml-fragment บนเนื้อหาของ columnDerivationDescription เพื่อเพียงแค่ดันเนื้อหาให้เหมาะสม เทมเพลตเปลี่ยนองค์ประกอบ select ตามต้องการ ซึ่งใช้งานได้ดีกว่าการพยายามแยกวิเคราะห์ข้อมูลมาก   -  person Martin Honnen    schedule 10.08.2016
comment
ขอบคุณ @MartinHonnen ฉันใช้ Saxon EE 9.6 อยู่ในปัจจุบัน ฉันจะลองคว้า 9.7 และลองใช้วิธีแก้ปัญหาของคุณ ขอบคุณอีกครั้ง.   -  person Huw    schedule 11.08.2016
comment
ฉันได้พยายามที่จะทำให้เกิดปัญหาอีกครั้งโดยใช้ Excel 2013 ก่อนอื่นมันปฏิเสธที่จะโหลด XML ที่สร้างขึ้นเลย โดยบ่น (ในไฟล์บันทึกที่ซ่อนไว้อย่างดี) เกี่ยวกับสิ่งต่าง ๆ เช่นค่า sBody ใน StyleID แต่เมื่อฉันแก้ไขค่าทั้งหมดเหล่านี้เป็นค่าที่นำมาจากแผ่นงานที่บันทึกไว้ของ Excel ตัวอย่างข้อมูลของแถวและเซลล์ที่สร้างขึ้นจะแสดงด้วยสีหรือตัวหนาสำหรับส่วนข้อความที่ได้รับการจัดรูปแบบพิเศษ   -  person Martin Honnen    schedule 12.08.2016


คำตอบ (1)


นี่คือวิธีที่คุณสามารถแก้ไขปัญหาโดยใช้ parse-xml-fragment (https://www.w3.org/TR/xpath-functions-31/#func-parse-xml-fragment มีให้ใช้งานใน Saxon 9.7 (ทุกรุ่น) เมื่อใช้ version="3.0" ใน XSLT ของคุณ) จากนั้นจึงใช้เทมเพลตในการแปลง องค์ประกอบที่คุณมีอยู่ภายในมาร์กอัปที่ใช้ Escape ในองค์ประกอบ 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 -->
person Martin Honnen    schedule 10.08.2016
comment
นั่นใช้ได้ผลในการสร้าง xml ที่ฉันได้รับตอนนี้เช่น <ss:Data ss:Type="String">Set to collected visit name [EG.VISIT] <Font html:color="#7030A0">Set to 'POST-BASELINE MINIMUM'</Font> . สเปรดชีตไม่แสดงคำสั่งรูปแบบอีกต่อไป แต่ก็ไม่แสดงการจัดรูปแบบเช่นกัน ฉันเพิ่งได้รับข้อความสีดำล้วน ไม่มีสี ไม่มีข้อความตัวหนา - person Huw; 11.08.2016
comment
@ หู ดูการแก้ไข ฉันไม่คุ้นเคยกับรายละเอียดของรูปแบบ Excel XML จริงๆ แต่การประกาศเนมสเปซที่เพิ่มเข้ามา xmlns="http://www.w3.org/TR/REC-html40" อาจช่วยแก้ไขปัญหาได้ ถ้าไม่ ให้ตรวจสอบรูปแบบที่คุณได้รับเมื่อบันทึกแผ่นงานด้วย Excel โดยตรงในรูปแบบผลลัพธ์ที่ต้องการ แล้วลองปรับโค้ด XSLT เพื่อสร้างรูปแบบ - person Martin Honnen; 11.08.2016
comment
เนมสเปซ xmlns="urn:schemas-microsoft-com:office:spreadsheet" ปรากฏในแท็ก ซึ่งเป็นสาเหตุที่ทำให้การจัดรูปแบบในเซลล์ใช้งานไม่ได้สำหรับฉัน ลิงก์ ให้วิธีแก้ปัญหาที่ใช้งานได้สำหรับสิ่งนี้ - person Huw; 29.08.2016