2012-12-27 29 views
5

Đây là tệp xml. Không gian và vận chuyển trở lại trong phần tử "CategoryName" được dự định.xsl: không gian dải không phải là loại bỏ trở lại vận chuyển

<?xml version="1.0" encoding="utf-8"?> 
<group> 
    <item> 
     <id>item 1</id> 
     <CategoryName> 


     </CategoryName> 
    </item> 
    <item> 
     <id>item 2</id> 
     <CategoryName></CategoryName> 
    </item> 
    <item> 
     <id>item 3</id> 
     <CategoryName>  </CategoryName> 
    </item> 

</group> 

Sau đây là tệp XSLT cho tệp XML ở trên. Những gì nó là giả sử để làm là nó sẽ xóa tất cả các không gian trống trong phần tử "CategoryName". Sau đó, nó sẽ kiểm tra xem "CategoryName" có trống hay không.

<?xml version="1.0" encoding="utf-8"?> 
<!-- DWXMLSource="testempty.xml" --> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/> 

    <xsl:strip-space elements="*" /> <!--HERE IS STRIP SPACE--> 


    <xsl:template match="/"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
    <title>Untitled Document</title> 
    </head> 

    <body> 
    <xsl:for-each select="/group/item"> 
     <xsl:if test="CategoryName = ''"> <!--HERE IS THE TEST--> 
     <p>Empty</p>   <!--IT WILL OUTPUT 'EMPTY' IF THE ELEMENT IS EMPTY--> 
     </xsl:if> 
    </xsl:for-each> 
    </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

Vấn đề là, xsl:strip-space không hoạt động. Chỉ "CategoryName" của Mục 2 vượt qua bài kiểm tra "trống".

Điều gì là sai?

+0

tôi thử nghiệm này trên nhật thực của tôi, nó làm việc như bạn mong đợi. Nó in 3 "rỗng" – Weibo

+0

tôi đã sử dụng Adobe Dreamweaver và nó chỉ hiển thị một Empty. – user1535147

+0

Có thể trùng lặp: http://stackoverflow.com/questions/1134318/xslt-xslstrip-space-does-not-work – K3N

Trả lời

1

Rõ ràng, bộ xử lý XSLT của DeamWeaver có lỗi.

Dưới đây là một cách để có được kết quả mong muốn:

Thay:

<xsl:if test="CategoryName = ''"> 

với:

<xsl:if test="not(normalize-space(CategoryName))"> 
+0

Sau 2 ngày mệt mỏi khi tìm kiếm trang web .... Cảm ơn bạn từ trái tim. – user1535147

+0

@ user1535147, Bạn được chào đón. Tôi khuyên bạn nên đọc một cuốn sách hay về XPath - xem câu trả lời này cho các tài nguyên tốt: http://stackoverflow.com/a/341589/36305 –

2

Tôi không biết công cụ XSLT Dreamweaver đang sử dụng, nhưng điều này có vẻ sai.

Tôi nghĩ rằng có thể có một số bộ vi xử lý XSLT chỉ áp dụng xsl: strip-space nếu bạn trình bày chúng với đầu vào chưa được phân tích (XML từ vựng), chứ không phải nếu bạn trình bày chúng với DOM. Không có gì trong spec để biện minh cho hành vi như vậy, nhưng nó làm cho cuộc sống của người thực hiện dễ dàng hơn rất nhiều.

Thật đáng để chỉ ra rằng đây không phải là cách xsl: không gian dải được dự định sẽ được sử dụng. Nó được thiết kế để được sử dụng để loại bỏ khoảng trống "có thể bỏ qua", đó là khoảng trắng được sử dụng để thụt lề trong nội dung chỉ phần tử. Nếu bạn đang sử dụng phép chuyển đổi nhận biết lược đồ XSLT 2.0, điều này sẽ được chính thức hóa thành một quy tắc: xsl: strip-space sẽ không ảnh hưởng đến nội dung của các phần tử có nội dung đơn giản. Điều này là do tước không gian cho một phần tử như vậy có thể làm cho phần tử không hợp lệ đối với lược đồ.

+0

đã đồng ý! Không gian hoặc vận chuyển trở lại không phải là null sau khi tất cả! –

+0

Vì vậy, tôi phải làm gì để kiểm tra các phần tử trống? – user1535147

+0

Sử dụng phép thử 'normalize-space (XX)! =' '' –

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