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>
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>
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, '')) > 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>
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
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
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àlà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.
@_marko: Bạn đã đọc câu trả lời của tôi và nó có hữu ích cho bạn không? –
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 *. –