2008-09-02 33 views

Trả lời

5

Nó có thể được thực hiện nhưng chỉ khi giá trị trả lại khi nút tồn tại là giá trị chuỗi của nút, không phải là nút chính nó. The XPath

substring(concat("N/A", /foo/baz), 4 * number(boolean(/foo/baz))) 

sẽ trả về giá trị chuỗi của thành phần baz nếu nó tồn tại, nếu không thì chuỗi "N/A".

Để khái quát phương pháp:

substring(concat($null-value, $node), 
      (string-length($null-value) + 1) * number(boolean($node))) 

nơi $null-value là chuỗi giá trị null và $node biểu thức để chọn nút. Lưu ý rằng nếu $node đánh giá thành một tập hợp nút chứa nhiều hơn một nút, giá trị chuỗi của nút đầu tiên là được sử dụng.

3

Câu trả lời ngắn gọn: không. Một hàm như vậy đã được xem xét và loại bỏ một cách rõ ràng đối với phiên bản 2 của đặc tả XPath (xem phi quy định Illustrative User-written Functions section).

1

Có thể thực hiện với XPath 1.0. Giả sử bạn có

<foo> 
    <bar/> 
</foo> 

Nếu bạn muốn kiểm tra nếu foo có một đứa trẻ baz,

substring("N/A", 4 * number(boolean(/foo/baz))) 

sẽ trở lại "N/A" nếu biểu thức /foo/baz trả về một nút-tập rỗng, nếu không nó sẽ trả về một chuỗi rỗng.

1

@jelovirt

Vì vậy, nếu tôi hiểu điều này một cách chính xác, chúng tôi nối câu trả lời mặc định và giá trị của các nút, và sau đó đi tập con đúng đắn về chuỗi kết quả bằng cách kiểm tra sự tồn tại của các nút để thiết lập bù đắp cho số không hoặc vị trí ngay sau chuỗi mặc định của tôi. Đó là sự biến đổi nghịch đảo nhất của một ngôn ngữ mà tôi từng thấy. (Tôi thích nó!)

Để làm rõ những gì bạn đã nói, phương pháp này hoạt động khi nút bị thiếu, không phải khi nút trống. Nhưng bằng cách thay thế "số (boolean ($ node))" với "string-length ($ node)", nó sẽ hoạt động trên các nút rỗng thay thế.

2

Đối với các nút rỗng, bạn cần

boolean(string-length($node)) 

(Bạn có thể bỏ qua các cuộc gọi đến number() như các diễn viên từ boolean để số được ngầm ở đây.)

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