2010-08-13 12 views
9

Ho un XML che viene trasformato con un XSLT in un foglio di Excel su una pagina web. I tag elemento in XML diventano intestazioni di colonna in Excel. Ci sono colonne che vorrebbero avere spazi. Non ci piacciono i caratteri di sottolineatura o i trattini che arrivano nelle intestazioni dei fogli Excel. Come posso incorporare lo spazio in un tag/elemento XML? Ho provato a inserire   o %20 o #&20; ecc. (Tutti i tipi di sintassi) ma tutti mostrano l'errore sull'editor XML che dice che questo carattere esadecimale non è consentito.Come includere lo spazio nel tag/elemento XML che viene trasformato da XSLT nel foglio Excel

mio XML è

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

Voglio uno spazio tra Additional e Remarks nel tag. Per favore aiuto. Grazie in anticipo.

+0

Buona domanda (+1). Vedi la mia risposta con una spiegazione dettagliata del perché questo non è possibile. –

risposta

15

Come incorporare spazio in un tag/elemento XML ? Ho provato a mettere o% 20 o &#20; ecc ecc. (tutti i tipi di sintassi), ma tutti loro mostra errore xml editor di se stesso dicendo questo carattere esadecimale non è consentito

Non puoi. Il W3C XML specification definisce rigorosamente la sintassi dei nomi. Un nome può iniziare solo con un carattere di lettera (questo include il carattere di sottolineatura, quindi i caratteri successivi possono essere caratteri di lettere o il trattino, ma lo spazio è un delimitatore e non è consentito come parte di alcun nome.

Altro precisamente, qui the exact rules from the spec:

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

per superare questa limitazione è necessario modificare la vostra trasformazione XSLT in modo da emettere come nomi di colonna Excell più conveniente leggere le stringhe di nomi XML

012.351.641,061 mila.
+0

Upvoted per Backus-Naur; abbastanza utile, grazie. – Dan

3

Oltre risposta esatta di Dimitre, si potrebbe usare un certo modello come in questo foglio di stile:

<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 questa corretta di input:

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

uscita:

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

In 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 per una buona logica – miti737

Problemi correlati