2009-12-05 38 views
7

Tôi đang cố gắng sử dụng các hàm XSL và Xpath để xóa tất cả khoảng trắng khỏi thuộc tính XML được gọi là tên và làm cho nó trở thành chữ thường. Tại thời điểm này tôi có một cái gì đó nhưChức năng Xpath để xóa không gian trắng

<xsl:variable name="linkName"> 
<xsl:value-of select="normalize-space(name)"/> 
</xsl:variable> 

Điều này sẽ loại bỏ khoảng trắng ở đầu và cuối chứ không phải ở giữa. Bất kỳ đề xuất?

các thực hành tốt nhất để xử lý và thay đổi dữ liệu XML như nó có vẻ rằng bạn có thể sử dụng

<xsl:value-of select="x"/> 

đặt trực tiếp trong HTML

hoặc

<xsl:attribute name="y"> 
<xsl:value-of select="x"/> 

hoặc sử dụng một

là gì
<xsl:variable name="x"> 

Tôi không thực sự chắc chắn về sự khác biệt hay khi nào nên sử dụng. Bất kỳ sự giúp đỡ nào cũng được đánh giá cao.

Ally

+1

Chỉ cần làm rõ một điểm, bình thường hóa không gian() sẽ loại bỏ các ký tự khoảng trống trùng lặp (khoảng trắng, tab và/hoặc dấu xuống dòng) ở giữa chuỗi và chuyển đổi chúng thành một dấu cách. –

Trả lời

6

Vì Tim Robinson chỉ ra, translate sẽ thực hiện thủ thuật. (Tôi sẽ không gọi nó là "hack", nhưng sau đó tôi đã lâu ở giai đoạn xác định-với-my-torturers của mối quan hệ của tôi với XSLT.) Mã của bạn sẽ dễ đọc hơn nếu bạn sử dụng một cái gì đó như thế này :

<xsl:variable name="uc" value="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/> 
<xsl:variable name="lc" value="abcdefghijklknopqrstuvwxyz"/> 
<xsl:variable name="ws" value=" &#13;&#10;&#09"/> 

... là một phần của tệp globals.xslt mà tôi bao gồm ở đầu hầu hết các biến đổi tôi viết. Sau đó, điều này:

<xsl:value-of select="translate(x, concat($uc, $ws), $lc)"/> 

dịch từng chữ cái viết hoa thành chữ thường và mỗi ký tự khoảng trắng thành không có gì.

Thông thường lý do bạn sử dụng xsl:variable là làm cho mã dễ đọc hơn (như trong ví dụ trên) hoặc lưu trữ kết quả trung gian không thể tính được hiệu quả. Cách thứ tư để đưa dữ liệu vào đầu ra là một trong những bạn không đề cập đến, và điều đó khá hữu ích: mẫu giá trị thuộc tính. Tất cả những điều này đều làm tương tự:

<link> 
    <xsl:attribute name="name"> 
     <xsl:value-of select="translate(name, concat($uc, $ws), $lc)"/> 
    </xsl:attribute> 
</link> 

<link> 
    <xsl:attribute name="name" value="translate(name, concat($uc, $ws), $lc)"/> 
</link> 

<xsl:variable name="linkName" value="translate(name, concat($uc, $ws), $lc)"/> 
<link name="{$linkName}"/> 

Trong trường hợp cụ thể này, có thể tranh luận về hai điều cuối cùng đơn giản và rõ ràng hơn. Hầu hết thời gian, tuy nhiên, không phải là việc tách các giá trị từ cách chúng được chèn vào đầu ra giúp dễ hiểu hơn, cũng như sử dụng AVT thay vì các cấu trúc XSLT dài dòng hơn làm điều tương tự.

3

này loại bỏ các khoảng trắng ở đầu và cuối nhưng không phải giữa. Bất kỳ đề xuất?

Bạn có thể sử dụng translate(' &#13;&#10;', '') để xóa các ký tự dấu cách, dòng mới và ký tự xuống dòng. Nếu bạn đang sử dụng các lớp .NET hoặc MSXSL để thực hiện phép biến đổi của bạn thì sẽ hơi khó để biến các ký tự thành chữ thường. Một hack tôi đã sử dụng là sử dụng transform để chuyển chữ hoa chữ thường thành chữ thường của chúng; khác là viết một đối tượng mở rộng .NET để cung cấp một hàm lower-case. Chức năng lower-case được tích hợp vào XPath/XSL 2.0.

Trong phần thứ hai của câu hỏi của bạn, họ làm những việc khác nhau:

  • <xsl:value-of ... nơi một giá trị trực tiếp trong HTML
  • <xsl:attribute ... tạo ra một thuộc tính trên phần tử HTML hiện và gán cho nó một giá trị
  • <xsl:variable ... tuyên bố biến XSL mà không ảnh hưởng đến HTML. Bạn có thể viết biến này vào HTML bằng cách sử dụng <xsl:value-of select="$x"/>.
Các vấn đề liên quan