2010-09-07 4 views
2

Я использую приложение Java на основе Saxon для анализатора XPath. Пожалуйста, обратите внимание на следующее:XPath query: Как обратиться к «текущему узлу» (Java/Saxon)

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

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

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

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

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

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

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

Благодаря,

JB

ответ

0

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

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

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

+0

вправо, так как я могу относиться к текущему узлу (<записи ref = "def">, тот, который я передаю в метод оценки XPath), поэтому я могу использовать значение под родительским? – user267749

+2

Получил!/import/record [id =/import/record [position()]/parent]/data – user267749

1

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

<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

Я очень ценю время, которое вы сделали, чтобы написать это, но я не использую XLST. Я использую Direct XPath против DOM. – user267749

+0

Можете ли вы использовать один и тот же подход из кода, или он должен быть в одном выражении? – rsp

+0

Одно выражение. Я вижу, что XLST имеет текущее значение, но при анализе DOM не возникает никаких положений - см. Список функций: http://www.saxonica.com/documentation/functions/intro.html – user267749

0

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

/импорта/запись [ID =/импорта/записи [положения()]/родителя]/данные

+0

На самом деле, я не уверен, что работает :-) – user267749

Смежные вопросы