2010-08-13 36 views
9

Tôi có một XML được chuyển đổi bằng XSLT thành một trang tính Excel trên trang web. Các thẻ phần tử trong XML trở thành các tiêu đề cột trong Excel. Có những cột mà muốn có không gian. Chúng tôi không thích dấu gạch dưới hoặc dấu gạch nối đến trong tiêu đề trang tính Excel. Làm cách nào để kết hợp không gian trong thẻ/phần tử XML? Tôi đã thử đặt   hoặc %20 hoặc #&20; v.v. (tất cả các loại cú pháp) nhưng tất cả chúng đều hiển thị lỗi trên chính trình soạn thảo XML nói rằng ký tự thập lục phân này không được phép.Cách bao gồm dấu cách trong thẻ XML/phần tử được XSLT chuyển đổi thành trang tính Excel

XML của tôi là

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

Tôi muốn có một khoảng trống giữa AdditionalRemarks trong thẻ. Xin vui lòng giúp đỡ. Cảm ơn trước.

+0

Câu hỏi hay (+1). Xem câu trả lời của tôi với một lời giải thích chi tiết tại sao điều này là không thể. –

Trả lời

15

Làm cách nào để kết hợp không gian trong thẻ/yếu tố XML ? Tôi đã thử đặt hoặc% 20 hoặc &#20; v.v. (Tất cả các loại cú pháp) nhưng tất cả đều cho thấy lỗi trên xml biên tập tự nói nhân vật hexadecimal này không được phép

Bạn không thể. W3C XML specification xác định đúng cú pháp của tên. Tên chỉ có thể bắt đầu bằng ký tự chữ cái (bao gồm dấu gạch dưới, sau đó các ký tự tiếp theo có thể là các ký tự chữ cái hoặc số dấu gạch ngang, nhưng khoảng trắng là dấu tách và không được cho phép như một phần của bất kỳ tên nào.

chính xác, đây là the exact rules from the spec:

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

để khắc phục hạn chế này, bạn phải thay đổi chuyển đổi XSLT của bạn để nó kết quả đầu ra như tên cột Excell thuận tiện hơn để đọc chuỗi hơn tên XML

.
+0

Được thăng hạng cho Backus-Naur; khá hữu ích, cảm ơn. – Dan

3

Bên cạnh câu trả lời chính xác Dimitre, bạn có thể sử dụng một số mô hình như trong stylesheet này:

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

Với đầu vào đúng này:

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

Output:

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

Trong 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 cho logic tốt – miti737

Các vấn đề liên quan