xslt, как выбирать теги на основе содержимого другого тега того же уровня - PullRequest
1 голос
/ 27 сентября 2010

Мой исходный файл выглядит так:

<stuff> 
<s>
    <contents>
      <code>503886</code>
      <code>602806</code>
    </contents>
    ...
</s>
<p>
    <code>344196</code>
    <export>true</export>
    ...
</p>
<!-- more 's' and 'p' tags -->
...
</stuff>

Мне нужно перебрать 's' и выбрать те, которые внутри тега 'содержимого' имеют 'код', принадлежащий 'p', который имеет export = true.

Я пытался решить эту проблему последние пару часов. Пожалуйста, поделитесь некоторыми идеями.

Ответы [ 2 ]

1 голос
/ 27 сентября 2010

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="kSByCode" match="s" use="contents/code"/>
    <xsl:template match="text()"/>
    <xsl:template match="p[export='true']">
        <xsl:copy-of select="key('kSByCode',code)"/>
    </xsl:template>
</xsl:stylesheet>

С этим входом:

<stuff>
    <s>
        <contents>
            <code>503886</code>
            <code>602806</code>
        </contents>
    </s>
    <p>
        <code>602806</code>
        <export>true</export>
    </p>
</stuff>

Выход:

<s>
    <contents>
        <code>503886</code>
        <code>602806</code>
    </contents>
</s>

Примечание : Всякий раз, когда естьперекрестные ссылки, используйте ключи.

Редактировать : Пропущена итерация по s части.Спасибо, Димитр!

Редактировать 2 : Перечитывая этот ответ, я увидел, что это может сбить с толку.Итак, для выражения , выбирающего узлы, используйте:

key('kSByCode',/stuff/p[export='true']/code)
0 голосов
/ 27 сентября 2010

Мне нужно перебрать 's' и выбрать те, которые внутри тега 'содержимого' имеют 'код', принадлежащий 'p', который имеет export = true.

Использование :

<xsl:apply-templates select=
 "/*/s
      [code
      =
       /*/p
          [export='true']
                      /code]"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...