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