2011-12-05 25 views
5

Sth phải là tất cả các chữ cái hoặc trong cụm từ thông dụng [A-Z]. Làm thế nào để kết hợp xslt với các biểu thức chính quy?Cách viết xslt nếu phần tử chứa chữ cái?

<xsl:if test="string-contains(//ns0:elem/value, 'sth')"> 


     </xsl:if> 
+0

@_marko: Bạn đã đọc câu trả lời của tôi và nó có hữu ích cho bạn không? –

+0

Tôi vừa cập nhật câu trả lời với biểu thức XPath thứ hai và một ví dụ mã hoàn chỉnh thể hiện cả hai biểu thức XPath 1.0 này - lần đầu tiên sử dụng phương thức * dịch đôi *. –

Trả lời

9

XPath/XSLT 1.0 không hỗ trợ biểu thức chính quy, nhưng xác thực đơn giản có thể được thực hiện bằng các hàm chuỗi cơ bản.

danh sách trắng

XPath 1.0 translate chức năng có thể được sử dụng để mô phỏng một danh sách trắng:

<xsl:variable name="alpha" 
       select="'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> 
<xsl:if test="string-length(translate(., $alpha, '')) &gt; 0"> 
    <!-- context node contains non-alpha characters --> 
</xsl:if> 

thử nghiệm này sử dụng translate đầu tiên loại bỏ tất cả các chữ thượng và chữ thường.Nếu độ dài của chuỗi kết quả không khác, thì chuỗi gốc phải chứa các ký tự bổ sung.

Lưu ý rằng biểu thức trên có thể được đơn giản hóa để:

<xsl:if test="translate(., $alpha, '')"> 

... bởi vì bất kỳ chuỗi không trống để đánh giá đúng.

Blacklisting

Sử dụng hai dịch phương pháp để điều trị $alpha như một danh sách đen:

<xsl:if test="translate(., translate(., $alpha, ''), '')"> 
    <!-- context-node contains characters on the blacklist (in $alpha) --> 
</xsl:if> 

Các nội translate trả về một chuỗi với tất cả các ký tự alpha của nó lấy ra, sau đó được sử dụng như là mẫu đến cuộc gọi translate thứ hai, dẫn đến một chuỗi chỉ chứa các ký tự alpha. Nếu chuỗi này không khác, thì chúng tôi đã tìm thấy một ký tự trong danh sách đen. Đây là một cách tiếp cận cổ điển. Xem, ví dụ, câu hỏi trước đây trên SO:

Một kiểm tra danh sách đen cũng có thể được thực hiện như thế này:

not(string-length(translate(., $alpha, ''))=string-length()) 

Nếu chiều dài của chuỗi sau khi loại bỏ tất cả các ký tự nằm trong danh sách cấm không bằng với độ dài của chuỗi gốc, sau đó chuỗi phải chứa một ký tự trong danh sách đen.

Tóm tắt

danh sách đen và danh sách cho phép là thực sự hai mặt của cùng một đồng tiền. Phần sau đây trình bày cách sử dụng của chúng với nhau:

<xsl:if test="translate(., $alpha, '')"> 
    [contains some characters not on the list] 
</xsl:if> 
<xsl:if test="not(translate(., $alpha, ''))"> 
    [contains only characters on the list] 
</xsl:if> 
<xsl:if test="translate(., translate(., $alpha, ''), '')"> 
    [contains some characters on the list] 
</xsl:if> 
<xsl:if test="not(translate(., translate(., $alpha, ''), ''))"> 
    [contains only characters not on the list] 
</xsl:if> 
2

Trong XPath 1.0 (chỉ hoạt động với XSLT 1.0), bạn không có công cụ để regex (bạn chỉ có các chức năng như contains hoặc starts-with, xem link bên dưới để biết thêm thông tin)

Trong XPath 2.0 (hoạt động với XSLT 2.0), bạn có chức năng matches và chức năng replace (xem liên kết bên dưới).

URL để xem:

XPath 1.0 chuỗi chức năng: http://www.w3.org/TR/xpath/#section-String-Functions

XPath 2.0 regex chức năng: http://www.w3.org/TR/xpath-functions/#string.match

+1

Tôi đã có giải pháp và đang sử dụng phiên bản 1.0. Làm thế nào để tìm kiếm các chữ cái trong một chuỗi nếu bạn không thể sử dụng regex trong xslt? – marko

2

Làm thế nào để tìm kiếm các ký tự trong một chuỗi nếu bạn không thể sử dụng regex trong xslt?

Câu hỏi hay, +1.

Sử dụng:

translate(., translate(., $vAlpha, ''), '') 

này tạo ra tất cả các ký tự trong chuỗi giá trị của nút hiện tại, màtrong $vAlpha

Trong trường hợp bạn muốn xem một chuỗi đã cho $str chỉ chứa các chữ cái và không có ký tự nào khác, sử dụng :

string-length(translate($str, $vAlpha, '')) = 0 

Một mã hoàn chỉnh ví dụ:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:variable name="vUpper" select= 
    "'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> 

<xsl:variable name="vLower" select= 
    "'abcdefghijklmnopqrstuvwxyz'"/> 

<xsl:variable name="vAlpha" select= 
     "concat($vUpper, $vLower)"/> 

<xsl:variable name="vStr" select="'A12B_..c02d'"/> 

<xsl:template match="/"> 
    <xsl:value-of select= 
    "translate($vStr, 
       translate($vStr, $vAlpha, ''), '') 
    "/> 


    The string <xsl:value-of select="$vStr"/> has <xsl:text/> 
    <xsl:value-of select= 
    "string-length(translate($vStr, $vAlpha, ''))"/> <xsl:text/> 
    non-letters 

</xsl:template> 
</xsl:stylesheet> 

khi chuyển đổi này được áp dụng trên bất kỳ tài liệu XML (không sử dụng), các truy nã, kết quả chính xác được sản xuất:

ABcd 


    The string A12B_..c02d has 7 
    non-letters 

Ghi nhớ: Biểu thức XPath đầu tiên ở trên thể hiện cái gọi là "phương pháp dịch đôi", được đề xuất đầu tiên bởi @Michael Kay.

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