Làm cách nào để kiểm tra xem giá trị nút có phải là một số hay không bằng cách sử dụng XPath?
Bất kỳ ý tưởng?
Làm cách nào để kiểm tra xem giá trị nút có phải là một số hay không bằng cách sử dụng XPath?
Bất kỳ ý tưởng?
Câu trả lời:
Kiểm tra giá trị so với NaN :
<xsl:if test="string(number(myNode)) != 'NaN'">
<!-- myNode is a number -->
</xsl:if>
Đây là phiên bản ngắn hơn (cảm ơn @Alejandro ):
<xsl:if test="number(myNode) = myNode">
<!-- myNode is a number -->
</xsl:if>
Required item type of first operand of '=' is numeric; supplied value has item type xs:string;
), tuy nhiên, giải pháp của Dimitre hoạt động tốt.
Cách ngắn nhất có thể để kiểm tra xem giá trị chứa trong một biến $v
có thể được sử dụng như một số hay không là :
number($v) = number($v)
Bạn chỉ cần thay thế $v
ở trên bằng biểu thức có giá trị mà bạn muốn kiểm tra.
Giải thích :
number($v) = number($v)
rõ ràng là đúng, nếu $v
là một số hoặc một chuỗi biểu thị một số.
Nó cũng đúng với một giá trị boolean, vì a number(true())
là 1 và number(false)
là 0.
Bất cứ khi nào $v
không thể được sử dụng như một số, thì number($v)
NaN là
và NaN không bằng bất kỳ giá trị nào khác, ngay cả với chính nó.
Do đó, biểu thức trên chỉ đúng với $v
giá trị của nó có thể được sử dụng như một số và sai nếu không.
number($v) = number($v)
mang lại kết quả khác với number($v) = $v
?
number($v) = number($v)
mang lại kết quả khác với number($v) = $v
? Không nghi ngờ gì nữa, điều đó bắt nguồn từ những gì bạn đã viết, nhưng tôi không biết bạn đã giải quyết câu hỏi này ở đâu một cách rõ ràng. Xin lỗi nếu tôi đang dày đặc. IOW, giải pháp của bạn và giải pháp của @ Oded / @ Alejandro có luôn mang lại kết quả giống nhau không?
Tôi không cố gắng cung cấp một giải pháp thay thế nào khác, mà là một "chế độ xem meta" cho vấn đề này.
Các câu trả lời đã được cung cấp bởi Oded và Dimitre Novatchev là đúng nhưng những gì mọi người thực sự có thể có nghĩa là với cụm từ "giá trị là một con số", tôi sẽ nói như thế nào, hãy để ý giải thích.
Theo một cách nào đó, tất cả đều đi đến câu hỏi nghe có vẻ kỳ lạ này: "bạn muốn thể hiện giá trị số của mình như thế nào?"
Hàm XPath number()
xử lý các số có
Lưu ý rằng điều này không bao gồm các biểu thức cho các giá trị số
Đây không chỉ là các tiêu chí được tạo thành. Một phần tử có nội dung theo lược đồ một giá xs:float
trị hợp lệ có thể chứa bất kỳ đặc điểm nào được đề cập ở trên. Tuy nhiên, number()
sẽ trả về giá trị NaN
.
Vì vậy, hãy trả lời cho câu hỏi của bạn "Làm cách nào tôi có thể kiểm tra bằng XPath nếu giá trị nút là số?" là "Sử dụng các giải pháp đã được đề cập bằng cách sử dụng number()
" hoặc "với một biểu thức XPath 1.0 duy nhất, bạn không thể". Hãy suy nghĩ về các định dạng số khả thi mà bạn có thể gặp phải và nếu cần, hãy viết một số loại logic để xác thực / phân tích cú pháp số. Trong quá trình xử lý XSLT, điều này có thể được thực hiện với một số mẫu bổ sung phù hợp, chẳng hạn.
Tái bút. Nếu bạn chỉ quan tâm đến các số khác 0, bài kiểm tra ngắn nhất là
<xsl:if test="number(myNode)">
<!-- myNode is a non-zero number -->
</xsl:if>
NaN
giá trị của kiểu dữ liệu số không bằng bất kỳ giá trị số và để so sánh nếu có ít nhất một đối số là dữ liệu số gõ thì khác là diễn viên đến số, đây là bài kiểm tra số ngắn nhất:number(MyNode)=MyNode