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=" 	"/>
... 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ự.
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. –