【问题标题】:XSLT: Passing Excel text color parameter to templatesXSLT:将 Excel 文本颜色参数传递给模板
【发布时间】:2016-08-27 19:50:18
【问题描述】:

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

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

由于多种原因,我无法将实际代码放在这里,但 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>

【问题讨论】:

  • 你是如何计算 $cellColor 的?任何 xslt 代码都会有所帮助。
  • 您也可以显示转换后的 xml 输出以了解为什么 excel 无法显示颜色。
  • 你的问题一点都不清楚。首先,我们需要知道转换的结果应该是什么,以便 Excel 正确显示它。找出(在这里说:msdn.microsoft.com/en-us/library/aa140066%28office.10%29.aspx)并将其添加到您的问题中。然后提供转换的可重现示例(包括正在使用的任何输入),以便我们可以修复它并使其输出上述预期结果。见:minimal reproducible example
  • @Jason H 我几乎可以肯定您只是使用纯 xml 来显示在 excel 中,这很好,因为您不必为单元格分配样式。如果您想要 excel 中的单元格样式,例如颜色、粗体文本,您当然需要在您的 xsl 和单元格中定义样式的工作簿/工作表。

标签: excel xslt xslt-1.0


【解决方案1】:

带有不同颜色字母的单元格在电子表格ML中看起来像这样

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

【讨论】:

  • 我不是 SpreadsheetML 方面的专家,但这看起来不对。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    通常当你想给xsl中的变量赋值时,你应该使用&lt;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 消失,你可以删除它。

    【讨论】:

    • 不,这没什么区别。您当然可以使用xsl:text 来输出文字文本。或者只是文字。结果将完全相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    相关资源
    最近更新 更多