Как включить пробел в тег / элемент XML, который преобразуется XSLT в лист Excel

xml excel xslt space

25933 просмотра

2 ответа

332 Репутация автора

На этот вопрос уже есть ответ здесь:

У меня есть XML, который преобразуется с помощью XSLT в лист Excel на веб-странице. Теги элементов в XML становятся заголовками столбцов в Excel. Есть столбцы, которые хотели бы иметь пробелы. Нам не нравятся подчеркивания или дефисы в заголовках листа Excel. Как включить пространство в тег / элемент XML? Я попытался поместить  или %20или #&20;и т. Д. (Все виды синтаксиса), но все они показывают ошибку в самом XML-редакторе, говоря, что этот шестнадцатеричный символ недопустим.

Мой XML

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

Я хочу пробел между Additionalи Remarksв теге. Пожалуйста помоги. Заранее спасибо.

Автор: Enggr Источник Размещён: 13.08.2010 09:47

Ответы (2)


18 плюса

212810 Репутация автора

Как включить пространство в тег / элемент XML? Я пытался положить или% 20 или &#20;т. Д. (все виды синтаксиса), но все они показывают ошибку на самом редакторе XML, говоря, что этот шестнадцатеричный символ недопустим

Вы не можете . Спецификация W3C XML строго определяет синтаксис имен. Имя может начинаться только с буквенного символа (включая подчеркивание), затем следующие символы могут быть буквенными символами или цифрами или дефисом, но пробел является разделителем и не допускается как часть какого-либо имени.

Точнее , вот точные правила из спецификации :

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

Чтобы преодолеть это ограничение, вы должны изменить преобразование XSLT, чтобы оно выводило в виде имен столбцов Excel более удобное для чтения строк, чем имена XML.

Автор: Dimitre Novatchev Размещён: 13.08.2010 10:10

4 плюса

0 Репутация автора

Помимо точного ответа Димитра, вы можете использовать шаблон, как в этой таблице стилей:

 <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;')
Автор: user357812 Размещён: 14.08.2010 05:05
Вопросы из категории :
32x32