Проверьте, существует ли узел с помощью XSLT

для начала я хотел бы спросить, есть ли разница между следующими двумя операторами для узлов 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 ответов


Он должен работать, за исключением того, что у вас есть два "и", и вам не нужен ведущий / перед 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 ) != ''">

я хотел бы спросить, является ли разница между следующими двумя операторы для узлов 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 дочерние элементы текущего узла, которые имеют пустую строку (") или строку только для пробела в качестве своей строки значение.

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

в коде:

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

выражение всегда 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()]