XSLT XML ke Excel dalam format teks sel

Saya membuat dokumen excel di mana teks tertentu di dalam sel akan diformat dalam warna atau huruf tebal yang berbeda.

misalnya spreadsheet saya seharusnya seperti ini: .

Teks yang ingin saya format memiliki tag di sekelilingnya di XML saya, mis. &lt;strong>. Saya telah menulis fungsi yang mengambil tag ini dan menggantinya dengan warna atau format tebal misalnya. <Font html:color="#0000FF"> text </Font> saat membuat output xml untuk dibuka di excel.

Masalahnya adalah ketika spreadsheet dibuka, teksnya tidak berwarna melainkan dikelilingi oleh perintah pemformatan <Font html:color="#0000FF">: .

Ini XML masukan saya

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

Ini XSLT lengkap saya

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

Berikut adalah contoh dari XML keluaran saya

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

Saya telah membuat xsl dan menyimpannya sebagai spreadsheet XML 2003 untuk memeriksa kodenya dan seperti yang diharapkan. Ketika saya mengganti ‹ > dengan &lt; dan &gt; saya mendapatkan masalah yang saya alami dengan output saya

Saya tidak tahu apakah ini terkait dengan penggunaan &lt; daripada ‹ saat membuat xml. Adakah yang punya masalah serupa dan menyelesaikannya? Atau bisa melihat di mana letak masalah saya?

Sunting:

Saya telah melakukan pembaruan pada XSLT inc. namespace html, seperti yang disarankan oleh Martin. Ini menciptakan XML seperti yang saya harapkan dan terlihat baik-baik saja.

Masalahnya sekarang ketika dibuka di excel formatnya tidak muncul, saya mendapatkan teks hitam polos.

Output tanpa pemformatan

Saya telah membuat contoh tampilannya dan disimpan sebagai spreadsheet XML 2003, untuk membandingkan keduanya dan keduanya sama. Menariknya: Jika saya menyalin kode dari contoh yang dibuat excel dan menempelkannya ke XML yang dibuat xslt lalu membukanya di excel, pemformatannya berfungsi. Jika saya menyalin kode dari xml yang dibuat xslt dan menempelkannya ke contoh yang saya buat di excel (yang berfungsi dengan baik), pemformatannya sekarang tidak lagi berfungsi.

Contoh yang dibuat Excel

Kode XML dari nilai yang dibuat 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>

Beginilah tampilan xml yang dibuat oleh XSLT saya:

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

Jadi, meskipun kode xmlnya sama, bergantung pada cara pembuatannya menentukan apakah kode tersebut berfungsi atau tidak.

Pertanyaan: Mungkinkah ada perbedaan pengkodean yang menjelaskan perilaku ini?


person Huw    schedule 10.08.2016    source sumber
comment
Saya akan mulai dengan secara manual membuat apa yang ingin Anda lihat di Excel, lalu mengekspor sebagai XML untuk melihat apa yang dibutuhkan Excel, lalu membuat itu di XSLT Anda.   -  person Jim Garrison    schedule 10.08.2016
comment
Itu kode yang banyak, tetapi fungsi yang mengembalikan node teks dengan xsl:value-of tidak akan pernah membuat elemen font, itu sudah pasti. Mengenai keseluruhan pendekatan, karena Anda sudah menggunakan XSLT 2.0, prosesor XSLT mana yang sebenarnya Anda gunakan? Dengan menggunakan Saxon 9 rilis 9.7 (bahkan edisi HE), Anda mungkin dapat beralih ke XSLT 3.0 dan kemudian menggunakan w3.org/TR/xpath-functions-31/#func-parse-xml-fragment pada konten columnDerivationDescription untuk sekadar mendorong konten ke kanan templat mengubah elemen select sesuai kebutuhan. Itu bekerja jauh lebih baik daripada mencoba mengurai data.   -  person Martin Honnen    schedule 10.08.2016
comment
Terima kasih @MartinHonnen, saat ini saya menggunakan Saxon EE 9.6. Saya akan mencoba mengambil 9.7 dan mencoba solusi Anda. Terima kasih lagi.   -  person Huw    schedule 11.08.2016
comment
Saya telah mencoba mereproduksi masalah menggunakan Excel 2013, pertama menolak memuat XML yang dihasilkan sama sekali, mengeluh (dalam file log tersembunyi dengan baik) tentang hal-hal seperti nilai sBody pada StyleID. Tapi begitu saya mengoreksi semua nilai tersebut ke nilai yang diambil dari lembar simpanan Excel, cuplikan Baris dan Sel yang dihasilkan muncul dengan warna atau tebal untuk bagian teks yang memiliki format khusus.   -  person Martin Honnen    schedule 12.08.2016


Jawaban (1)


Inilah cara Anda mengatasi masalah menggunakan parse-xml-fragment (https://www.w3.org/TR/xpath-functions-31/#func-parse-xml-fragment, tersedia dalam Saxon 9.7 (semua edisi) saat menggunakan version="3.0" di XSLT Anda) dan kemudian templat untuk diubah elemen yang Anda miliki di dalam markup yang lolos di elemen 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
Itu berhasil untuk membuat xml yang sekarang saya dapatkan mis. <ss:Data ss:Type="String">Set to collected visit name [EG.VISIT] <Font html:color="#7030A0">Set to 'POST-BASELINE MINIMUM'</Font> . Spreadsheet tidak lagi menampilkan perintah format, tetapi juga tidak menampilkan pemformatan, saya hanya mendapatkan teks hitam polos, tanpa warna, tanpa teks tebal. - person Huw; 11.08.2016
comment
@Huw, lihat hasil editnya, saya tidak begitu paham dengan detail format XML Excel, tapi mungkin deklarasi namespace yang ditambahkan xmlns="http://www.w3.org/TR/REC-html40" memperbaiki masalah. Jika tidak, periksa format yang Anda dapatkan saat menyimpan lembar dengan Excel secara langsung dalam format keluaran yang diinginkan dan coba sesuaikan kode XSLT untuk membuat format tersebut. - person Martin Honnen; 11.08.2016
comment
Namespace xmlns="urn:schemas-microsoft-com:office:spreadsheet" muncul di tag, itulah alasan pemformatan dalam sel tidak berfungsi untuk saya. tautan Memberikan solusi yang berfungsi untuk ini. - person Huw; 29.08.2016