2011-01-14 47 views
6

Để bắt đầu, tôi muốn hỏi, là có một sự khác biệt giữa hai câu sau đây cho các nút XML:Kiểm tra nếu một nút tồn tại sử dụng XSLT

  1. kiểm tra liệu một nút là một nút rỗng;
  2. kiểm tra xem nút có tồn tại hay không;

Giả sử tôi có một tập tin XML như thế này:

<claim_export_xml> 
<claim_export_xml_row> 
    <claim_number>37423</claim_number> 
    <total_submitted_charges>0</total_submitted_charges> 
    <patient_control_no/> 

    <current_onset_date>2009-06-07 00:00:00</current_onset_date> 

và tôi muốn kiểm tra xem "current_onset_date" nút tồn tại hay không, tôi đã sử dụng XSLT sau:

<xsl:for-each select="claim_export_xml_row "> 
     <xsl:if test="claim_number =$mother_claim_no and /current_onset_date "> 

Vòng lặp for-each là một số logic mà tôi phải chịu đựng để vòng lặp hoạt động. Nhưng tôi đã nhận được kết quả sai sau khi chạy XSLT này, dữ liệu xml ở trên sẽ không được lấy bởi XSLT của tôi. Nhưng tôi không nghĩ rằng bằng cách sử dụng "current_onset_date = ''" là chính xác, hoặc, vì nó là thử nghiệm cho "cho dù current_onset_date không có gì".

Ai có thể cho tôi biết sai lầm của tôi ở đâu và cũng giúp tôi với câu hỏi của tôi được liệt kê trong đầu, cảm ơn!

Trả lời

4

Nó sẽ làm việc ngoại trừ việc bạn đã có hai "và" 's và bạn không cần hàng đầu/trước current_onset_date.

Nếu bạn muốn kiểm tra cho sự trống rỗng là tốt, bạn có thể sử dụng:

<xsl:for-each select="claim_export_xml_row "> 
    <xsl:if test="claim_number =$mother_claim_no and current_onset_date != ''"> 

lý do này hoạt động là giá trị chuỗi của một phần tử là nối của tất cả các văn bản bên trong nó, do đó, biểu thức này sẽ chỉ chọn các hàng có current_onset_date tồn tại và chứa một chuỗi không trống. Nếu bạn muốn loại trừ các yếu tố có chứa gì, nhưng khoảng trắng, bạn có thể viết:

<xsl:for-each select="claim_export_xml_row "> 
    <xsl:if test="claim_number =$mother_claim_no and normalize-space(current_onset_date) != ''"> 
+0

khi tôi thoát khỏi/hàng đầu, nó sẽ khiếu nại rằng đây là xpath không hợp lệ và "và" là lỗi đánh máy, xin lỗi – Kevin

+0

Thông báo lỗi bạn nhận được khi bạn xóa /? Tôi đã thử nghiệm một cấu trúc tương tự và nó hoạt động tốt. – biziclop

+0

nó chỉ phàn nàn rằng XPath này không hợp lệ, không có lý do cụ thể. Tuy nhiên, tôi tìm thấy một cách giải quyết khác, đó là sử dụng count (current_onset_date)! = 0. Bạn có nghĩ rằng nó đang làm thử nghiệm đúng không? – Kevin

17

Tôi muốn hỏi, có sự khác biệt giữa hai câu sau đây cho các nút XML:

1. kiểm tra xem một nút là một nút rỗng;

2. kiểm tra xem nút có tồn tại hay không;

Những yêu cầu biểu hiện khác nhau để kiểm tra: một nút đó không tồn tại không phải là một nút rỗng:

current_onset_date 

này chọn bất kỳ current_onset_date con của nút hiện hành. Giá trị boolean của nó là true() nếu và chỉ khi có ít nhất một đứa trẻ đó tồn tại và false() - nếu không.

current_onset_date/text() 

tùy chọn này sẽ chọn bất kỳ nút con văn bản nào của bất kỳ nút nào hiện tại là current_onset_date.Nếu không có, giá trị boolean của nó là false(), nếu không - true(),

Ngay cả khi phần tử không có nút văn bản là trẻ em, nó vẫn có thể có giá trị chuỗi không trống, vì nó có thể có các phần tử dưới dạng hậu duệ và một số phần tử con này có thể có con nút văn bản.

current_onset_date[not(string(.))] 

sẽ chọn bất kỳ số nào của chuỗi hiện tại, có chuỗi rỗng ('') làm giá trị chuỗi của chúng. Điều này có thể đủ điều kiện cho "phần tử trống".

Nếu bằng trống bạn có nghĩa là một yếu tố mà chuỗi giá trị là một trong hai sản phẩm nào hoặc trắng-không gian-chỉ, sau đó biểu thức này:

current_onset_date[not(normalize-space())] 

này chọn bất kỳ current_onset_date con của nút hiện tại, mà có sản phẩm nào string ('') hoặc một chuỗi trắng-không gian chỉ làm giá trị chuỗi của chúng.

Ai có thể cho tôi biết nơi sai lầm của tôi là

Trong mã của bạn:

<xsl:for-each select="claim_export_xml_row ">        
    <xsl:if test="claim_number =$mother_claim_no 
           and /current_onset_date ">  

biểu thức trong thuộc tính test luôn là false()/current_onset_date có nghĩa là: yếu tố hàng đầu (của tài liệu) có tên là "current_onset_date", nhưng phần tử trên cùng trong trường hợp của bạn có tên là claim_export_xml

Bạn có thể muốn:

claim_number =$mother_claim_no and current_onset_date 

Và nếu bạn muốn phần tử là "không rỗng", sau đó:

claim_number =$mother_claim_no 
    and 
    current_onset_date[normalize-space()] 
+2

+1 Câu trả lời thích hợp khác. Tôi đã ngừng viết bài của tôi. –

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