Cách chèn & nbsp; trong XSLT


207

Làm thế nào tôi có thể chèn

 

Trong biểu định kiểu XSLT, tôi tiếp tục gặp lỗi này:

Lỗi phân tích cú pháp XML: thực thể không xác định

Về cơ bản tôi muốn một nhân vật không phá vỡ không gian trong Mẫu XSLT.


2
Bạn cũng có thể sử dụng & # xA0; tương tự với & # 160; xem tại đây stackoverflow.com/questions/7511214/
Mạnh

Câu trả lời:


336

Sử dụng mã thực thể  thay thế.

 là một "tham chiếu thực thể ký tự" HTML. Không có thực thể được đặt tên cho không gian không phá vỡ trong XML, vì vậy bạn sử dụng mã  .

Wikipedia bao gồm một danh sách các thực thể XML và HTML và bạn có thể thấy rằng chỉ có 5 "thực thể được xác định trước" trong XML, nhưng HTML có hơn 200. Tôi cũng sẽ chỉ đến Tạo một khoảng trắng (& nbsp;) trong XSL có câu trả lời tuyệt vời.


3
Gần đây, chúng tôi đã gặp phải một tình huống khi chỉ một trong nhiều XSL ngừng hoạt động với kỹ thuật này và bắt đầu thể hiện một nhân vật lạ. Tuy nhiên, nếu tôi sử dụng kỹ thuật CDATA của WaterSoul thì nó hoạt động.

@BrianReindel, điều đó có thể có nghĩa là bạn đã sử dụng tham chiếu thực thể số sai, tức là Šthay vì  cái sau sẽ luôn phân giải thành một không gian không phá vỡ Unicode.
Abel

Liên kết Mười mẹo Java và XSLT hàng đầu thực sự hữu ích.
LCJ

<xsl: text> & # 160; </ xsl: text> nó tách biệt hai trường
Manash Ranjan Dakua

1
Các liên kết đã thối.
GSerg

37

&#160;hoạt động thực sự tốt. Tuy nhiên, nó sẽ hiển thị một trong những ký tự lạ đó trong mã hóa ANSI. <xsl:text>làm việc tốt nhất cho tôi

<xsl:text> </xsl:text>

3
Sử dụng câu trả lời được chấp nhận, tôi đã kết thúc với một khoảng trắng ngắt dòng trong đầu ra XML của mình (ít nhất đó là giao diện trong trình soạn thảo XML của VS2010). Sử dụng câu trả lời này tôi chỉ nhận được chính xác 1 khoảng trắng.
Mathijs Flietstra

1
@Matthijs, đây là một không gian, không phải là một không gian không phá vỡ, không giống nhau. Nếu VS hiển thị không chính xác, hãy kiểm tra mã hóa của bạn (VS hoàn toàn có khả năng hiển thị chính xác và nó phải được mã hóa độc lập, do đó nhiều khả năng bạn đã làm sai điều gì khác).
Abel

25

Người ta cũng có thể làm điều này:

<xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text>

2
Điều này sẽ hoạt động nếu bộ xử lý hỗ trợdisable-output-escaping , điều này không bắt buộc và nó không được dùng trong XSLT 2.0 và hơn thế nữa trong 3.0. Trong các phiên bản này, bạn có thể đạt được hiệu ứng tương tự với xsl:character-mapbộ xử lý chéo được đảm bảo. Ngoài ra, điều này đặt một thực thể được đặt tên &nbsp;trong đầu ra, không nhất thiết giống như một không gian không phá vỡ và kết thúc nhận phải có thực thể này được khai báo (trong HTML nó thường được ngầm định).
Abel

21

Dùng cái này

<xsl:text disable-output-escaping="yes">&amp;</xsl:text>nbsp;

chỉnh sửa: Downvoters có lẽ nên xác nhận rằng điều này hoạt động trước tiên (nó là, và là giải pháp chung nhất cho vấn đề.)


1
Không chắc chắn, nhưng tôi đã thử nghiệm phương pháp của mình và nó hoạt động, vì vậy tôi không chắc chắn downvote là gì cho :(
jagprinderdeep

2
Ngoài ra, câu trả lời được chấp nhận sẽ không có giá trị cho tất cả các trình phân tích cú pháp theo trang được liên kết; chỉ cần ngẩng cao đầu
jagprinderdeep

1
Tôi đã đưa ra lý do cho downvote của tôi trước đây, nhưng nếu tôi đã downvote câu trả lời này , thì lý do sẽ là - nó trả lời sai câu hỏi. OP rõ ràng đã hỏi làm thế nào để đưa vào không gian không thể phá vỡ, sử dụng xslt và bạn đã trả lời cách đặt chuỗi ký tự dấu và dấu chấm phẩy. Và cãi nhau vì downvote cũng không tốt. Nhưng nghiêm túc, bạn đã bao giờ nói điều đó về CDATA chưa?
Michael Krelin - tin tặc

1
Được rồi, jagprinderdeep, tôi thu hồi downvote của mình, nhưng đổi lại xin hãy đến thăm tôi một khi tôi trúng tị nạn tâm thần. (lưu ý rằng tôi không cung cấp cho bạn downvote vì lý do mới đó). Nhưng hãy hiểu rằng bạn trả lời sai câu hỏi. Tôi nghĩ đó chính xác là lý do đằng sau các downvote khác.
Michael Krelin - tin tặc

8
Tôi cũng đánh giá thấp vì bạn không thể đảm bảo kết thúc nhận sẽ khai báo & nbsp;. Nếu bạn đang làm việc với xslt + html, thì có, đây là một cách để làm điều đó, mặc dù là hack. Nhưng, nếu bạn đang sử dụng xslt để tạo xml khác, thì nó sẽ làm bạn nổ tung.
Doug

14

Bạn có thể muốn thêm định nghĩa cho thực thể này vào đầu tệp (bên dưới khai báo xml):

<!DOCTYPE stylesheet [
<!ENTITY nbsp  "&#160;" >
]>

Ngoài ra, bạn có thể thêm nhiều thực thể như Ntilde, Aacute, v.v.


5

Ngoài câu trả lời của người chiến thắng hugo, có thể nhận được tất cả các tham chiếu ký tự đã biết hợp pháp trong tệp XSLT, như sau:

<!DOCTYPE stylesheet [
  <!ENTITY % w3centities-f PUBLIC "-//W3C//ENTITIES Combined Set//EN//XML"
      "http://www.w3.org/2003/entities/2007/w3centities-f.ent">
  %w3centities-f;
]>
...
<xsl:text>&amp; &nbsp; &ndash;</xsl:text>

Cũng có sự khác biệt nhất định trong kết quả của phương pháp này so với <xsl:text disable-output-escaping="yes">một. Loại thứ hai sẽ tạo ra chuỗi ký tự chuỗi như &nbsp;cho tất cả các loại đầu ra, thậm chí cho <xsl:output method="text">và điều này có thể khác với những gì bạn muốn ... Ngược lại, việc nhận các thực thể được xác định cho mẫu XSLT <!DOCTYPE ... <!ENTITY ...sẽ luôn tạo ra đầu ra phù hợp với xsl:outputcài đặt của bạn .

Và khi bao gồm tất cả các tham chiếu ký tự, có thể là khôn ngoan khi sử dụng trình phân giải thực thể cục bộ để giữ cho công cụ XSLT không tìm nạp các định nghĩa thực thể ký tự từ Internet. Người dùng JAXP hoặc Xalan-J rõ ràng có thể cần một bản vá cho Xalan-J để sử dụng trình phân giải chính xác. Xem blog XSLT, thực thể, Java, Xalan ... của tôi để tải về bản vá và nhận xét.


1
Lưu ý rằng gần đây, W3 bắt đầu chặn quá nhiều yêu cầu đối với những yêu cầu đó và các liên kết tương tự nếu đến từ một quy trình tự động. Đặt tệp đó cục bộ hoặc trên máy chủ của bạn và điều chỉnh URL cho phù hợp và bạn sẽ ổn. Ngoài ra, +1 và giải pháp tuyệt vời để sử dụng các thực thể có tên HTML.
Abel

Một lưu ý tốt và cũng có một lý do khác để có một bản sao cục bộ của tệp với các định nghĩa thực thể, vì nếu không thì quá trình XSLT có thể bị lỗi nếu không có kết nối internet. Trong thế giới Java, không cần phải hack URL, vì có thể sắp xếp một EntityResolver và Trình giải quyết XML Commons của Apache có thể là một ứng cử viên sáng giá. Các nền tảng lập trình khác cũng có khả năng có các kỹ thuật tương tự ...
Sergey Ushakov


2

Khi bạn sử dụng những thứ sau (không có disable-output-escaping!) Bạn sẽ nhận được một khoảng trống không phá vỡ:

<xsl:text>&#160;</xsl:text>


4
Bạn không cần disable-output-escapingđiều này
Ian Roberts

2

Các bảng định kiểu XSLT phải là XML được định dạng tốt. Do "&nbsp;"không phải là một trong năm thực thể XML được xác định trước , nên nó không thể được bao gồm trực tiếp trong biểu định kiểu. Vì vậy, trở lại với giải pháp của bạn "&#160;"là một sự thay thế hoàn hảo của "&nbsp;"bạn nên sử dụng.

Thí dụ:

<xsl:value-of select="$txtFName"/>&#160;<xsl:value-of select="$txtLName"/>

0

bạn cũng có thể dùng:

<xsl:value-of select="'&amp;nbsp'"/>

nhớ amp sau & hoặc bạn sẽ nhận được thông báo lỗi


Điều này sẽ xuất ra &amp;nbsp;(giả sử bạn dự định có dấu chấm phẩy ở đó), nó sẽ hiển thị dưới dạng &nbsp;chứ không phải là `` (nb-space).
Abel

0

Tôi đã cố gắng hiển thị đường viền trên một ô trống trong bảng HTML. Thủ thuật cũ của tôi về việc sử dụng không gian không phá vỡ trong các ô trống không hoạt động từ xslt. Tôi đã sử dụng ngắt dòng với hiệu ứng tương tự. Tôi đề cập đến điều này chỉ trong trường hợp lý do bạn cố gắng sử dụng không gian không phá vỡ là để cung cấp một số nội dung cho một ô bảng 'trống' để bật viền ô.

<br/>

Tôi có một kịch bản tương tự, và điều này dường như hoạt động trong việc lấy các ô của bảng để hiển thị.
Richard Moore

0

Thử sử dụng

<xsl:text>&#160;</xsl:text>

Nhưng nó phụ thuộc vào bộ xử lý XSLT mà bạn đang sử dụng: thông số XSLT không yêu cầu bộ xử lý XSLT chuyển đổi nó thành " &nbsp;".


0

Mặc dù câu trả lời đã được cung cấp bởi @brabster và những người khác.
Tôi nghĩ rằng giải pháp tái sử dụng nhiều hơn sẽ là:

<xsl:variable name="space">&#160;</xsl:variable>
...
<xsl:value-of select="$space"/>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.