xpath表达式,用于根据父属性选择子节点

时间:2009-09-10 22:39:58

标签: xml xslt xpath

<module>
<component>
   <section>
      <ptemplateId root="1.8"/>
      <entry>
    <observation>
       <templateId root="1.24"/>
    </observation>
      </entry>
   </section>
</component>
<component>
   <section>
      <ptemplateId root="1.10"/>
      <entry>
    <observation>
       <templateId root="1.24"/>
    </observation>
      </entry>
   </section>
</component>
<component>
   <section>
      <ptemplateId root="1.23"/>
      <entry>
    <observation>
       <templateId root="1.24"/>
    </observation>
     <entryRelation>
        <observation>
         <templateId root="1.24"/>
        </observation>
     </entryRelation>
      </entry>
   </section>
</component>
<component>
       <section>
          <ptemplateId root="1.8"/>
          <entry>
        <observation>
           <templateId root="1.24"/>
        </observation>
         <entryRelation>
            <observation>
             <templateId root="1.28"/>
            </observation>
         </entryRelation>
          </entry>
       </section>
    </component>
</module>

我想在基于ptemplateId的模板中选择观察,我能知道匹配表达式吗?

<xsl:template match"******">
   <!-- some processing goes here to process
        observation if ptemplateId is 1.8... -->
</xsl:template>

<xsl:template match"******">
   <!-- some processing goes here to process
        observation if ptemplateId is other than   1.8... -->
</xsl:template>


 there can be nested observation's also. (i am looking for a match expression with axis expressions to make it more generic)

3 个答案:

答案 0 :(得分:6)

试试这个:

/module/component/section[ptemplateId/@root='1.23']//observation

当然,用你想要的ptemplateId / @ root值代替'1.23'。这应该涵盖嵌套的观察,只要它们出现在包含ptemplateId的部分的子节点。

您可以在我的在线xpath测试器here尝试此操作。

这对你有用吗?

修改:您也可以考虑使用此变体,以便放入<xsl:template match="..." />

<xsl:template match="observation[ancestor::section/ptemplateId/@root = '1.23']"/>

答案 1 :(得分:2)

我现在无法对此进行测试,而且自从我做了xpath以来它一直是一个小问题,但我认为以下内容应该有效。它将树向下导航到包含root属性的节点,其值等于1.23,然后使用..表示parrent。

//module/component/section/ptemplateId[@root='1.23']/..

答案 2 :(得分:0)

另一种方法是使用XSL密钥:

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
  <!-- the key indexes all <observation> elements by their ptemplateId -->
  <xsl:key 
    name="kObservation" 
    match="observation" 
    use="ancestor::section[1]/ptemplateId/@root" 
  />

  <xsl:template match="/">
    <!-- you can then select all the matching elements directly -->
    <xsl:apply-templates select="key('kObservation', '1.8')" />
  </xsl:template>

  <xsl:template match="observation">
    <!-- (whatever) -->
    <xsl:copy-of select="." />
  </xsl:template>

</xsl:stylesheet>

以上产量:

<observation>
  <templateId root="1.24" />
</observation>
<observation>
  <templateId root="1.24" />
</observation>
<observation>
  <templateId root="1.28" />
</observation>