使用XSLT检查节点是否存在

时间:2011-01-14 18:20:35

标签: xml xslt

首先,我想问一下,XML节点的以下两个语句之间是否存在差异:

  1. 检查节点是否为空节点;
  2. 检查节点是否存在;
  3. 假设我有一个这样的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 个答案:

答案 0 :(得分:17)

  

我想问一下,有没有   以下两者之间的区别   XML节点的语句:

     

1.检查节点是否为空节点;

     

2.检查节点是否存在;

这些需要不同的表达式来测试:不存在的节点不是空节点:

current_onset_date 

这将选择当前节点的任何current_onset_date子节点。当且仅当至少有一个这样的孩子存在时,它的布尔值为true(),否则为false()

current_onset_date/text()

这将选择当前节点的任何current_onset_date子节点的任何文本节点子节点。如果没有,则其布尔值为false(),否则为 - true()

即使元素没有文本节点作为子元素,它仍然可能具有非空字符串值,因为它可能具有元素作为后代,而其中一些元素后代可能具有文本节点子元素。 / p>

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

答案 1 :(得分:4)

它应该有效,除了你有两个“和”,并且你不需要在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 ) != ''">