xpath выражение для выбора дочернего узла на основе родительских свойств - PullRequest
3 голосов
/ 11 сентября 2009
<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 ]

6 голосов
/ 11 сентября 2009

Попробуйте это:

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

Подставляя нужное значение корневого ptemplateId / @ вместо 1.23, конечно. Это должно охватывать вложенные наблюдения, если они происходят где-либо как дочерние элементы раздела, содержащего этот ptemplateId.

Вы можете попробовать это в моем онлайн-тестере xpath, здесь .

Это у вас работает?

Редактировать: Вы также можете рассмотреть этот вариант для размещения в <xsl:template match="..." />.

<xsl:template match="observation[ancestor::section/ptemplateId/@root = '1.23']"/>
2 голосов
/ 11 сентября 2009

Я не могу проверить это прямо сейчас, и это было немного, так как я сделал xpath, но я думаю, что следующее должно работать. Он перемещается вниз по дереву к узлу, содержащему корневой атрибут со значением, равным 1,23, а затем использует .., который ссылается на parrent.

//module/component/section/ptemplateId[@root='1.23']/..
0 голосов
/ 11 сентября 2009

Альтернативой может быть использование ключа 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...