Проверьте, существует ли узел, используя XSLT - PullRequest
6 голосов
/ 14 января 2011

Для начала я хотел бы спросить ,, есть ли разница между следующими двумя операторами для узлов XML:

  1. проверить, является ли узел пустым узлом;
  2. проверьте, существует узел или нет;

Предположим, у меня есть XML-файл, подобный следующему:

<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>

, и я хочу проверить, существует ли узел "current_onset_date" или нет,Я использовал следующий XSLT:

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

Цикл for-each - это некоторая логика, с которой мне приходится иметь дело, чтобы цикл работал.Но после того, как я запустил этот XSLT, я получил неверный результат, вышеупомянутые xml-данные не будут получены моим XSLT.Но я не думаю, что использование «current_onset_date = ''» также является правильным, поскольку он проверяет «содержит ли current_onset_date ничего».

Может кто-нибудь сказать мне, где моя ошибка, а также помочь мне с моим вопросомв начале, спасибо!

Ответы [ 2 ]

17 голосов
/ 14 января 2011

Я хотел бы спросить, есть ли Разница между следующими двумя операторы для узлов XML:

1.проверьте, является ли узел пустым;

2.проверьте, существует ли узел или нет;

Для этого требуются различные выражения для проверки : несуществующий узел не является пустым узлом:

current_onset_date 

это выбирает любые current_onset_date дочерние элементы текущего узла. Его логическое значение равно true() тогда и только тогда, когда существует хотя бы один такой дочерний элемент, и false() - в противном случае.

current_onset_date/text()

это выбирает любые дочерние текстовые узлы из любых current_onset_date дочерних узлов текущего узла. Если их нет, его логическое значение равно false(), в противном случае - true(),

Даже если элемент не имеет текстовых узлов в качестве дочерних, он все равно может иметь непустое строковое значение, поскольку он может иметь элементы в качестве потомков, а некоторые из этих дочерних элементов могут иметь дочерние элементы текстовых узлов.

current_onset_date[not(string(.))]

это выбирает любые current_onset_date дочерние элементы текущего узла, которые имеют пустую строку ('') в качестве значения строки. Это может хорошо подходить для «пустого элемента».

Если под пустым вы подразумеваете элемент, строковое значение которого пустое или только пробел, то это выражение:

current_onset_date[not(normalize-space())]

это выбирает любые current_onset_date дочерние элементы текущего узла, которые имеют пустую строку ('') или строку только для пробелов в качестве строкового значения.

Может кто-нибудь сказать мне, где моя ошибка есть

В вашем коде:

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

выражение в атрибуте test всегда false(), потому что /current_onset_date означает: верхний элемент (документа) с именем "current_onset_date", но верхний элемент в вашем случае с именем claim_export_xml

Вы, вероятно, хотите :

claim_number =$mother_claim_no and current_onset_date 

А если вы хотите, чтобы элемент был "непустым", то:

    claim_number =$mother_claim_no 
   and 
    current_onset_date[normalize-space()]  
4 голосов
/ 14 января 2011

Это должно работать, за исключением того, что у вас есть два "и" и вам не нужно начинать / перед current_onset_date.

Если вы также хотите проверить пустоту, вы можете использовать:

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

Причина, по которой это работает, состоит в том, что строковое значение элемента является объединением всего текста внутри него, поэтому это выражение будет выбирать только те строки, где current_onset_date существует и содержит непустую строку. Если вы хотите исключить элементы, которые не содержат ничего, кроме пробелов, вы можете написать:

<xsl:for-each select="claim_export_xml_row ">
   <xsl:if test="claim_number =$mother_claim_no and normalize-space( current_onset_date ) != ''">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...