【问题标题】:How to include space in XML tag/element which gets transformed by XSLT into Excel sheet [duplicate]如何在 XSLT 将其转换为 Excel 工作表的 XML 标记/元素中包含空格 [重复]
【发布时间】:2019-04-23 21:31:57
【问题描述】:

我有一个 XML,它通过 XSLT 转换为网页上的 Excel 工作表。 XML 中的元素标记成为 Excel 中的列标题。有些列想要有空格。我们不喜欢 Excel 工作表标题中出现下划线或连字符。 如何在 XML 标记/元素中合并空间?我尝试输入  %20#&20; 等(各种语法),但它们都在 XML 编辑器本身上显示错误,说不允许使用此十六进制字符。

我的 XML 是

<ClientArray>
  <Client>
    <LastName>Aanonsen</LastName>
    <FirstName>Fred</FirstName>
    <Additional Remarks><Additional Remarks>
  </Client>

我想要标签中 AdditionalRemarks 之间的空格。 请帮忙。提前致谢。

【问题讨论】:

  • 好问题 (+1)。请参阅我的回答,详细解释为什么这是不可能的。

标签: xml excel xslt space


【解决方案1】:

如何在 XML 中合并空格 标签/元素?我试着把 or %20 or &amp;#20; 等等等等。 (各种语法),但它们都在 xml 上显示错误 编辑器本身说这个十六进制 字符不允许

你不能W3C XML specification 严格定义了名称的语法。名称只能以字母字符(包括下划线)开头,然后下一个字符可以是字母字符或数字或连字符,但空格是分隔符,不允许作为任何名称的一部分。

更准确地说,这里是the exact rules from the spec

[4a]    NameChar    ::=    NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040] 
[5]    Name    ::=    NameStartChar (NameChar)* 

要克服这个限制,您必须修改 XSLT 转换,使其输出为 Excel 列名,比 XML 名称更便于读取字符串。

【讨论】:

  • 支持巴库斯-瑙尔;很有帮助,谢谢。
【解决方案2】:

除了 Dimitre 的确切答案之外,您还可以使用此样式表中的一些模式:

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="Client/*" name="space-capital">
        <xsl:param name="pLetters"
                   select="translate(name(),'qwertyuiopasdfghjklzxcvbnm','')"/>
        <xsl:param name="pString" select="name()"/>
        <xsl:param name="pOut" select="''"/>
        <xsl:choose>
            <xsl:when test="$pString != ''">
                <xsl:variable name="vFirst" select="substring($pString,1,1)"/>
                <xsl:call-template name="space-capital">
                    <xsl:with-param name="pLetters" select="$pLetters"/>
                    <xsl:with-param name="pString"
                                               select="substring($pString,2)"/>
                    <xsl:with-param name="pOut"
                         select="concat($pOut,
                                        substring(' ',1,contains($pLetters,
                                                                 $vFirst)
                                                        and
                                                        $pOut != ''),
                                        $vFirst
                                       )"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="concat($pOut,' : ',.,'&#xA;')"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

有了这个正确的输入:

<ClientArray>
  <Client>
    <LastName>Aanonsen</LastName>
    <FirstName>Fred</FirstName>
    <AdditionalRemarks>Something</AdditionalRemarks>
  </Client>
</ClientArray>

输出:

Last Name : Aanonsen
First Name : Fred
Additional Remarks : Something

在 XPath 2.0 中:

string-join(/*/*/*/concat(
                (: This is the expression you need :)
                     replace(name(),
                             '(\P{Lu})(\p{Lu})',
                             '$1 $2'),
              (: the rest is just to mimic the result :)
                     ' : ',.),
            '&#xA;')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    相关资源
    最近更新 更多