2011-01-14 70 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 "> 

for-each循环是我为了循环工作必须承担的一些逻辑。但是在运行这个XSLT之后,我真的得到了错误的结果,上面的xml数据不会被我的XSLT抓住。但我不认为使用“current_onset_date =''”是正确的,因为它正在测试“current_onset_date是否包含任何内容”。

有没有人可以告诉我我的错误在哪里,并帮助我列出我的问题一开始,谢谢!

回答

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) != ''"> 
+0

一旦我摆脱了领先/的,它会抱怨这是无效的xpath和“和”是一个错字,对不起 – Kevin 2011-01-14 18:25:29

+0

当你删除/时,你得到的错误信息是什么?我测试了一个类似的结构,它运行良好。 – biziclop 2011-01-14 18:33:19

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孩子当前节点的,具有空字符串('')或只有空格的字符串作为它们的字符串值。

有谁告诉我,我的错误 是

在您的代码:

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