2010-06-16 36 views
5

Tôi có một XML nhưchuyển đổi Chữ thường trong XSL

<emps> 
<emp id='3432'> 
<fname>Jack</fname> 
<lname>Dawson</lname> 
<emp> 
<emp id='1122'> 
<fname>Jack</fname> 
<lname>Thompson</lname> 
<emp> 
<emps> 

Tôi đang phát triển một ứng dụng web mà tìm kiếm xml này dựa trên tên đầu tiên bước vào và đi lên với một trang kết quả. Để đạt được điều này, tôi đã viết một xslt để chuyển đổi XML thành HTML dựa trên chuỗi tìm kiếm đầu vào được chuyển thành một biến có tên là srchStr.

<xsl:template match="employees"> 
    <xsl:for-each select="emp[fname=$srchStr]"> 
<tr> 
    <xsl:variable name="id"> 
    <xsl:value-of select="@id" /> 
    </xsl:variable> 
    <td> 
    <a href='detailSearch.do?id={$id}'> 
    <xsl:value-of select="fname" /> 
    , 
    <xsl:value-of select="lname" /> 
    </a> 
    </td> 

    </tr> 
</xsl:for-each 
</xsl:template> 

Nhưng người dùng có thể nhập tên trong trường hợp chữ thường hoặc chữ thường. Vậy làm thế nào để chuyển đổi tên đầu tiên bên trong thẻ xml fname thành chữ thường và so sánh?

Một số người có thể đặt đoạn mã để sử dụng fn:lower-case bên trong xsl của tôi.

+1

Duplicate của http://stackoverflow.com/questions/586231/how-can-i-convert -a-string-to-upper-or-lower-case-with-xslt –

Trả lời

10

Để chuyển đổi một chuỗi để giảm trường hợp hoặc chữ hoa bạn có thể sử dụng XPath 1.0 chức năng translate:

Đầu tiên xác định bảng chữ cái của mình cho chữ thường và chữ cái viết hoa. Lưu ý rằng vị trí của mỗi cặp nhân vật cần phải được giống nhau:

<xsl:variable name="lcletters">abcdefghijklmnopqrstuvwxyz</xsl:variable> 
<xsl:variable name="ucletters">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable> 

Sau đó, bạn có thể chuyển đổi sang chữ hoa:

<xsl:value-of select="translate($toconvert,$lcletters,$ucletters)"/> 

hoặc để giảm trường hợp

<xsl:value-of select="translate($toconvert,$ucletters,$lcletters)"/> 
+0

Điều này không hoạt động khi không có ánh xạ một-một giữa chữ thường và chữ hoa. Các ettsett Đức (ß) là chữ thường và phiên bản chữ hoa là "SS". (Hai chữ cái 'S'.) Xem xét số lượng chữ cái Unicode và khả năng thậm chí cả các trang web/dịch vụ chỉ gặp một người có dấu trọng âm trong tên của họ, đây là giải pháp không khả thi trừ khi bạn chỉ quan tâm đến cách viết tên. – yam655

+0

@ yam655: Thật vậy, việc dịch một ký tự thành hai ký tự sẽ không hoạt động khi sử dụng cách tiếp cận này. Một tùy chọn có thể là thêm ánh xạ vào ký tự mã LATIN CAPITAL SHARP S mã Unicode (U + 1E9E) đã được thêm vào năm 2008. Bằng cách này, các ký tự có dấu sẽ hoạt động, chúng chỉ có trong danh sách dưới tên Tomalak chỉ ra. Nhưng sau cùng, XSLT/XPath 1.0 là một nền tảng rất hạn chế, và tôi chắc chắn sẽ khuyên bạn nên thực hiện chuyển đổi trường hợp bằng cách sử dụng một thư viện chuyên dụng với sự hỗ trợ tốt cho I18N. Tuy nhiên, –

+0

chỉ hiển thị vấn đề với phương thức dịch(). Khi bạn đối phó với các ngôn ngữ không phải tiếng Anh, bạn bắt đầu có nhiều ánh xạ cho những thứ có ngôn ngữ giống nhau. Trong tiếng Đức, "ß" nên so sánh giống như "ss", nhưng mọi người có thể đoán được điều đó. Các vấn đề lớn hơn đến từ các chữ cái có dấu, nơi bạn có khả năng tập hợp các điểm nhấn không tiến lên trên một chữ cái cơ bản so với một điểm duy nhất. ('Ê' so với không tiến bộ '^' và tiêu chuẩn 'E', v.v.) Tôi đồng ý, tốt hơn là sử dụng thư viện có hỗ trợ I18N rõ ràng. IMO, dịch() nên tránh. – yam655

4

emp[lower-case(fname)=lower-case($srchStr)]

Hoặc, nếu bạn chỉ có XPath 1.0, bạn có thể thử sử dụng dịch như sau: http://geekswithblogs.net/TimH/archive/2006/07/06/84229.aspx

Được cảnh báo mặc dù, ví dụ với translate sẽ không hoạt động trên tên với điểm nhấn (như tôi :)

+1

'translate()' hoạt động trên các ký tự có dấu trọng âm. Họ chỉ cần có trong danh sách. – Tomalak

+0

@Tomalak: tất nhiên, tôi có nghĩa là ví dụ cụ thể mà tôi đã liên kết. –

+0

và @Tomalak: Cảm ơn cả hai bạn đã giúp tôi! – Bala

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