Запрос XPath: как обратиться к «текущему узлу» (Java / Saxon) - PullRequest
2 голосов
/ 07 сентября 2010

Я использую Java-приложение на основе Saxon для парсера XPath. Пожалуйста, примите во внимание следующее:

<import>  
  <record ref="abc">  
    <id>123</id>  
    <data>Value<data>  
  </record>  
  <record ref="def">  
    <parent>123</parent>  
    <data>Value2</data>  
  </record> 
</import> 

Мой вариант использования: я перебираю узлы записи и мне нужно найти другой с атрибутом ref, равным значению дочернего родительского узла.

Если текущим узлом является <record ref="def">, как я могу написать запрос для возврата узла данных в первом узле записи путем сопоставления с /query/record/id/text() = current node/parent/text()?

Если я выполню этот запрос:

/import/record[id/text() = '123']/data

Тогда я получаю правильный узел данных, но я не могу заменить «123» на значение под родительским узлом?

Я попытался заменить '123' with ./parent/text(), и пока XPath компилируется, никаких результатов не возвращается.

Спасибо

JB

Ответы [ 3 ]

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

С периодом, на который вы ссылаетесь на узел в контексте пути, вы должны иметь возможность использовать переменные для решения вашей проблемы:

<xsl:template match="/import/record[@parent]">
    <xsl:variable name="pid" select="./parent/text()" />
    <xsl:for-each select="/import/record[id/text() = $pid">
        <!-- actions -->
    </xsl:for-each>
</xsl:template>

редактировать

Вы можете получить что-то вроде следующего единственного выражения xpath:

/import/record[id/text() = /import/record/parent/text()]/data

(выберите те записи, на которые ссылаются другие)

0 голосов
/ 07 сентября 2010

По какой-то причине current () существует в XSLT, но не для XPath против DOM.Вы можете жестко написать что-то вроде этого:

/ import / record [id = / import / record [position ()] / parent] / data

0 голосов
/ 07 сентября 2010

Период используется для обозначения текущего узла. Однако у вас есть недостаток в вашей логике: каков ваш путь

/import/record[id/text() = ./parent/text()]/data

определяет <record>, который имеет дочерний элемент parent и a id, который должен иметь одинаковое содержимое.

...