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

时间:2016-05-02 22:39:34

标签: excel xslt xslt-1.0

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

<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)如何让它消失。

编辑 - 解决cellColor评论

由于多种原因,我无法在此处输入实际代码,但是在textColor之前计算了cellColor变量。最重要的是:

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

3 个答案:

答案 0 :(得分:1)

具有不同颜色字母的单元格在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>

答案 1 :(得分:1)

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

答案 2 :(得分:0)

通常,当您想要为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消失,你可以删除它。