XPath. Выберите узлы на основе другого, связанного узла - PullRequest
0 голосов
/ 23 декабря 2009

У меня есть xml, который содержит две группы связанных значений:

<Rows>
    <!-- first group -->
    <Row>
        <Sequence>100</Sequence>
        <Value>+</Value>
    </Row>
    <Row>
        <Sequence>105</Sequence>
        <Value>+</Value>
    </Row>    
    <Row>
        <Sequence>110</Sequence>
        <Value>-</Value>
    </Row>
    <!-- second group -->
    <Row>
        <Sequence>150</Sequence>
        <Value>20</Value>
    </Row>
    <Row>
        <Sequence>155</Sequence>
        <Value>15</Value>
    </Row>    
    <Row>
        <Sequence>160</Sequence>
        <Value>90</Value>
    </Row>    
</Rows>

Каждый элемент 1-й группы связан с элементом 2-й группы: sequence -> sequence + 50

Iнеобходимо получить набор узлов из 2-й группы, в которых связанные узлы из 1-й группы содержат знак + (узлы с последовательностями 150 и 155).

Эти узлы необходимы для будущей сортировки и перечисления.

/Rows/Row[contains(/Rows/Row[Sequence = (./Sequence - 50)]/Value, '+')]

Я пробовал описанный выше xpath, но не смог, поскольку ./ ссылается на текущий контекст (в вторых скобках), но мне нужен доступ к родительскому (в первых скобках).

Делать кому-либознаете решение для этого?

С уважением, Aikin

PS подстрока (./ Sequence - 50, 1, 3) используется для получения

Ответы [ 2 ]

1 голос
/ 23 декабря 2009

Просто переверните запрос вверх ногами:

/Rows/Row[/Rows/Row[contains(Value, '+')]/Sequence = Sequence - 50]

Стоит также отметить, что xsl:key может быть полезным для ускорения процесса.

1 голос
/ 23 декабря 2009

Существует различие между узлом контекста (.) и текущим узлом (current()) в XPath / XSLT. Смотрите также этот связанный вопрос:

Текущий узел против узла контекста в XSLT / XPath?

В вашем примере вам нужно будет использовать current() для ссылки на текущий узел, например,

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="Row">
    <Row1>
      <xsl:copy-of select="."/>
    </Row1>
    <Row2>
      <xsl:copy-of select="/Rows/Row[./Sequence = (current()/Sequence + 50) and current()/Value = '+']"/>
    </Row2>
  </xsl:template>
</xsl:stylesheet>

Приведенный выше короткий фрагмент XSLT скопирует каждую строку с соответствующей строкой из второй группы в выходной документ с условием, которое вы задали в своем вопросе (разница равна 50, а в первой строке есть значение +).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...