首先,我想问一下,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是否包含任何内容”。
有人可以告诉我我的错误在哪里,也帮助我开始列出我的问题,谢谢!
答案 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 ) != ''">