2010-08-13 12 views
9

Tengo un XML que se transforma con un XSLT en una hoja de Excel en una página web. Las etiquetas de elemento en XML se convierten en encabezados de columna en Excel. Hay columnas que desearían tener espacios. No nos gustan los guiones bajos o guiones que vienen en los encabezados de las hojas de Excel. ¿Cómo puedo incorporar espacio en una etiqueta/elemento XML? Intenté poner   o %20 o #&20; etc. (todo tipo de sintaxis) pero todos ellos muestran errores en el editor XML en sí mismo diciendo que este carácter hexadecimal no está permitido.Cómo incluir espacio en la etiqueta XML/elemento que se transforma mediante XSLT en la hoja de Excel

Mi XML es

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

Quiero un espacio entre Additional y Remarks en la etiqueta. Por favor ayuda. Gracias por adelantado.

+0

Buena pregunta (+1). Vea mi respuesta con una explicación detallada de por qué esto no es posible. –

Respuesta

15

¿Cómo incorporo espacio en un XML tag/element? Intenté poner o% 20 o &#20; etc etc. (todos los tipos de sintaxis), pero todos ellos muestra error en XML propio editor decir esto carácter hexadecimal no se permite

No se puede. El W3C XML specification define estrictamente la sintaxis de los nombres. Un nombre solo puede comenzar con un carácter de letra (esto incluye subrayado, luego los siguientes caracteres pueden ser caracteres de letras o números o el guión, pero el espacio es un delimitador y no está permitido como parte de ningún nombre.

Más precisamente, aquí son the exact rules from the spec:

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

para superar esta restricción tiene que modificar su transformación XSLT de forma que produzca como nombres de columna Excell más convenientes para leer cadenas que nombres XML

.
+0

Upvoted para Backus-Naur; bastante útil, gracias. – Dan

3

Además respuesta exacta de Dimitre, se puede utilizar un patrón como en esta hoja de estilo:

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

Con esta entrada correcta:

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

Salida:

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

En 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;') 
+0

+1 para una buena lógica – miti737

Cuestiones relacionadas