如何获取父节点?

时间:2012-12-14 16:20:47

标签: xpath

//* [ local-name()='component' and namespace-uri()='urn:hl7-org:v3'   ] 

使用此路径,我可以获得这样的节点:

<?xml version="1.0" encoding="utf-8"?>
<ClinicalDocument xmlns="urn:hl7-org:v3">
<component>
    <structuredBody> 
      <component>
          <section>
          <code code="10164-2" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC"/>
          <title>History of Present Illness</title>
          <text>
          </text>
          </section>
      </component>
    <component>     ......      </component>
    <component>     ......      </component>
</structuredBody>
</component>
</ClinicalDocument>

为了得到如下节点:

<component>
        <section>
        <code code="10164-2" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC"/>
        <title>History of Present Illness</title>
        <text>
        </text>
        </section>
    </component>

我将路径更改为:

//* [ local-name()='component' and namespace-uri()='urn:hl7-org:v3'  and  position()=1] 

但是,如何使用[code="10164-2"]作为资格来获得相同的结果?

编辑2012-12-17

  

//:成分[1] //:成分[.//:部分/:代码[@码= '10164-2']]

这个xpath运行良好,我可以得到我想要的节点。如果我使用

,我该怎么办?
  

// * [local-name()='component'和namespace-uri()='urn:hl7-org:v3'])[1]

选择父<component/>节点,然后将[@ code ='10164-2']添加到谓词部分以获取我想要的<component/>子节点。 (我不想在路径中使用:避免命名空间问题)

2 个答案:

答案 0 :(得分:1)

只需在谓词中添加and section/code/@code='10164-2'

//*:component[namespace-uri()='urn:hl7-org:v3' and section/code/@code='10164-2']

注意:如果namespace-uri()='urn:hl7-org:v3'不在该命名空间中,则可能必须删除component。您在&#34; 中的示例,以便获得如下节点:&#34;没有命名空间。

此外,由于您标记了XPath 2.0问题,因此我使用*:component代替local-name()

答案 1 :(得分:1)

使用

      ((//*[local-name()='component'
         and namespace-uri()='urn:hl7-org:v3']
       )[1]
          //*[local-name()='component'
            and
              namespace-uri()='urn:hl7-org:v3'
             ]
      )[1]

基于XSLT的验证

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "((//*[local-name()='component'
         and namespace-uri()='urn:hl7-org:v3']
     )[1]
        //*[local-name()='component'
            and
              namespace-uri()='urn:hl7-org:v3']
     )[1]
     "/>
 </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时:

<component xmlns="urn:hl7-org:v3">
    <structuredBody>
      <component>
          <section>
          <code code="10164-2" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC"/>
          <title>History of Present Illness</title>
          <text>
          </text>
          </section>
      </component>
    <component>     ......      </component>
    <component>     ......      </component>
</structuredBody>
</component>

评估XPath表达式并将此评估结果复制到输出中:

<component xmlns="urn:hl7-org:v3">
   <section>
      <code code="10164-2" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC"/>
      <title>History of Present Illness</title>
      <text/>
   </section>
</component>