XSLT:将Excel文本颜色参数传递给模板



这个让我完全困惑。我有一个多文本彩色单元格。大多数数据都是以这样或那样的方式共享的,所以我想使用模板来完成大部分工作。为此,我试图将文本颜色作为参数传递给模板。一个非常简单的例子:

<xsl:variable name="textColor">
    <xsl:choose>
        <xsl:when test="$cellColor = 's73'">
            <xsl:text>#FFFFFF</xsl:text>
        </xsl:when>
        <xsl:otherwise>
            <xsl:text>#000000</xsl:text>
        </xsl:otherwise>
    </xsl:choose>
</xsl:variable>
<xsl:call-template name="detailLines">
    <xsl:with-param name="textColor" select="$textColor"/>
</xsl:call-template>
<xsl:template name="detailLines">
    <xsl:param name="textColor"/>
    <!-- Start new line -->
    <xsl:text disable-output-escaping="yes">&amp;#10;</xsl:text>
    <!-- Bunch of stuff after this -->
    <Font html:Color="{$textColor}">
        <xsl:text>[</xsl:text>
    </Font>

通常我对此没有任何问题,但当文本颜色似乎没有通过时,我惊呆了。然而,当我调试时,文本颜色正在通过。进一步的调查表明,创建的XML也有文本颜色,但Excel不显示它,而是默认为黑色。

我把Excel命名空间放在了它们通常的位置,即使试图移动它们也无助于解决问题。

<xsl:stylesheet version="1.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">
<xsl:output method="xml" encoding="UTF-8"/>

任何想法都会很棒!我还没有遇到过像这样的问题,变量的行为符合预期,但Excel不是。

编辑以添加附加信息:

我发现了一个区别,但我不知道如何解释。

<Font html:Color="#FFFFFF">Two Box</Font>
<Font html:Color="#FFFFFF">]</Font>
<Font html:Color="#FFFFFF" xmlns="urn:schemas-microsoft-com:office:spreadsheet">[</Font>

前两行来自未输入detailLines模板的代码,因此它直接调用cellColor变量。最后一行来自传递变量的模板。名称空间似乎导致了我的问题,但我不明白1)为什么它在那里,以及2)如何让它消失。

EDIT-寻址单元格颜色注释

由于多种原因,我无法将实际代码放在这里,但cellColor变量是在textColor之前计算的。它被编辑得最多的是:

    <xsl:variable name="cellColor">
        <xsl:choose>
            <xsl:when test="A">
                <xsl:text>s216</xsl:text>
            </xsl:when>
            <xsl:when test="B'">
                <xsl:text>s73</xsl:text>
            </xsl:when>
            <xsl:otherwise>
                <xsl:text>s210</xsl:text>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>

在spreadsheetML 中,具有不同颜色字母的单元格如下所示

<Cell> <ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40"> <Font html:Color="#000000">tes</Font> <Font html:Color="#9BC2E6">t</Font> </ss:Data> </Cell>

根据我自己和评论者Peter Vande Weyer的决定,没有办法以我尝试的方式传递文本颜色。出现此问题的原因是此颜色格式所在的模板不是主模板,因此xslt处理器正在应用命名空间。命名空间的此应用程序导致Excel失败,因为它不应位于处理器插入它的位置。此时唯一的解决方案是在处理此文本格式时不使用单独的模板。

通常,当您想在xsl中为变量赋值时,应该使用<xsl:value-of select=

将cellColor变量分配更改为:

<xsl:variable name="cellColor">
        <xsl:choose>
            <xsl:when test="A">
                <xsl:value-of select="'s216'"/>
            </xsl:when>
            <xsl:when test="B'">
                <xsl:value-of select="'s216'"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="'s210'"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>

将textColor变量设置为:

<xsl:variable name="textColor">
    <xsl:choose>
        <xsl:when test="$cellColor = 's73'">
            <xsl:value-of select="'#FFFFFF'"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="'#000000'"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:variable>

关于如何让它在xmlns中消失,你可以直接删除它。

最新更新