2010-08-13 10 views
9

Bir XSLT ile bir web sayfasındaki bir Excel sayfasına dönüştürülen bir XML'im var. XML'deki öğe etiketleri, Excel'de sütun başlıkları olur. Boşlukları olmasını isteyen sütunlar var. Excel sayfa başlıklarında görünen alt çizgi veya tire türlerinden hoşlanmayız. XML etiketine/elemanına nasıl yer ekleyebilirim?   veya %20 veya #&20; vb. (Her tür sözdizimi) eklemeyi denedim ancak hepsi bu onaltılık karaktere izin verilmediğini söyleyen XML düzenleyicide hata gösteriyor.XSLT tarafından Excel sayfasına dönüştürülen XML etiketine/elemanına nasıl yer verilir

Benim XML ben etiketinde Additional ve Remarks arasına boşluk istiyorum

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

olduğunu. Lütfen yardım edin. Şimdiden teşekkürler.

+0

İyi soru (+1). Cevabımın bunun neden mümkün olmadığına dair ayrıntılı bir açıklama ile birlikte görün. Backus-Naur için ayrılan –

cevap

15

XML'de bir alan nasıl eklenir tag/element? Takmayı veya% 20 veya &#20; vb. (Bütün sözdizimi türlü) ama bunların hepsi bu onaltılık karakteri söyleyerek xml editörü kendisinde hata gösterir Sen olamaz

izin verilmez. W3C XML specification kesinlikle adların sözdizimini tanımlar. Bir isim sadece bir harf karakteri ile başlayabilir (bu alt çizgi içerir, sonra bir sonraki karakterler sayılar ya da kısa çizgi harf karakterleri olabilir, ancak boşluk bir sınırlayıcıdır ve herhangi bir adın parçası olarak kullanılamaz.

Daha fazla tam, burada the exact rules from the spec şunlardır:

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

Eğer daha uygun Excell sütun adları XML adlarında daha dizeleri okumak gibi çıktılar böylece XSLT dönüşümü değiştirmek zorunda bu kısıtlamayı aşmak için

. Dimitre kesin cevap yanında
+0

; oldukça yararlı, teşekkürler. İyi mantık için – Dan

3

, bu stil gibi bazı desen kullanabilirsiniz:

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

bu doğru girisiyle:

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

Çıktı:

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

:

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