2011-01-14 4 views
6

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

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

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

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

ответ

4

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

когда я избавлюсь от ведущего /, он будет жаловаться что это недопустимый xpath, а «и» - опечатка, извините – Kevin

+0

. Какое сообщение об ошибке вы получаете, когда вы удаляете /? Я тестировал аналогичную конструкцию, и она отлично работала. – biziclop

+0

он просто жалуется, что этот XPath недействителен, никаких конкретных аргументов. Тем не менее, я нашел обходное решение, которое использует count (current_onset_date)! = 0. Как вы думаете, он делает правильное тестирование? – Kevin

17

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

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

В коде:

<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()] 
+2

+1 Более правильный ответ. Я прекратил писать. –

Смежные вопросы