2010-09-03 20 views
10

Tôi phải tạo biến XSL với một lựa chọn trong đó. Như sau:Làm cách nào để xoá khoảng trắng khi khai báo biến XSL?

<xsl:variable name="grid_position"> 
    <xsl:choose> 
    <xsl:when test="count(/Element) &gt;= 1"> 
     inside 
    </xsl:when> 
    <xsl:otherwise> 
     outside 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

Và sau này trong mã của tôi, tôi làm một xsl nếu:

<xsl:if test="$grid_position = 'inside'"> 
    {...code...} 
</xsl:if> 

Vấn đề là biến của tôi là không bao giờ = 'bên trong' vì sự ngắt dòng và thụt lề. Làm cách nào để xóa khoảng trắng khỏi biến của tôi? Tôi biết tôi có thể loại bỏ nó bằng cách sử dụng disable-output-escaping="yes" khi tôi sử dụng nó trong một bản sao xsl: copy-of, nhưng nó không hoạt động trên thẻ xsl: variable. Vậy làm thế nào tôi có thể loại bỏ các khoảng trống và ngắt dòng?

+0

Câu hỏi hay (+1). Xem câu trả lời của tôi cho một biểu thức XPath ngắn, một lớp cho '' :) –

Trả lời

16

Đó là những gì <xsl:text> dành cho:

<xsl:variable name="grid_position"> 
    <xsl:choose> 
    <xsl:when test="count(/Element) &gt;= 1"> 
     <xsl:text>inside</xsl:text> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text>outside</xsl:text> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

Nó cho phép bạn cấu trúc mã của bạn kiểm soát khoảng trắng cùng một lúc. Trong thực tế, bạn nên tránh các nút văn bản trong XSL không được gói trong <xsl:text> để tránh các loại lỗi này trong tương lai, (tức là khi mã được định dạng lại hoặc được xác định lại sau).

Đối với các trường hợp đơn giản, như trong mẫu của bạn, hãy thực hiện what Jim Garrison suggests cũng là một tùy chọn.


Ngoài ra, việc kiểm tra sự tồn tại của phần tử với count() là không cần thiết. Chọn nó là đủ, vì tập hợp nút rỗng đánh giá là false.

<xsl:when test="/Element"> 
+0

Cảm ơn bạn đã giải pháp này Tomalak, nó hoạt động hoàn hảo! – Gabriel

+0

@Gabriel: Bạn được chào đón.:) – Tomalak

+0

+1 để giải thích giá trị boolean của nút thiết lập –

4

Cách đơn giản nhất không phải là để đặt khoảng trắng có ở nơi đầu tiên:

<xsl:variable name="grid_position"> 
    <xsl:choose> 
    <xsl:when test="count(/Element) &gt;= 1">inside</xsl:when> 
    <xsl:otherwise>outside</xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 
+0

+1 sửa lỗi đơn giản nhất của bạn. – Tomalak

+0

+1 cho cách đơn giản nhất –

+2

Cảm ơn bạn đã trả lời, nhưng tôi đã đi với câu trả lời của Tomalak vì tôi không muốn mã của tôi bị hỏng nếu ai đó định dạng lại mã xsl để thêm ngắt dòng. – Gabriel

1

Chỉ cần sử dụng:

+0

+1 cho một biểu thức dòng –

+0

+1 cho mẹo tuyệt vời này. Tôi thường bỏ lỡ "?:" Toán tử bậc ba của C/Java/JavaScript. – dolmen

2

Các chiến lược trong câu trả lời khác là tốt, trên thực tế thích hợp hơn với trang này khi khả thi. Nhưng có những lúc bạn không có quyền kiểm soát (hoặc khó kiểm soát hơn) những gì trong biến. Trong những trường hợp, bạn có thể tước đi những không gian xung quanh khi bạn đang thử nghiệm biến:

Thay vì

<xsl:if test="$grid_position = 'inside'"> 

sử dụng

<xsl:if test="normalize-space($grid_position) = 'inside'"> 

normalize-space() dải hàng đầu và dấu khoảng trắng, và sụp đổ các khoảng trắng lặp lại khác cho những khoảng trắng đơn.

+0

+1 Đó là câu trả lời rõ ràng đã bị thiếu cho đến nay. Lưu trữ khoảng trắng dư thừa và sau đó loại bỏ nó một lần nữa không phải là thanh lịch, nhưng đôi khi không có cách nào xung quanh nó, ví dụ khi bạn không có ảnh hưởng đến XML. – Tomalak

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