2009-03-29 18 views
6

Первый вопрос: есть ли способ получить имя атрибутов узла?Имя запроса и атрибутов XPath 1

<node attribute1="value1" attribute2="value2" /> 

Второй вопрос: существует ли способ получить атрибуты и значения как пары значений? Ситуация следующая:

<node attribute1="10" attribute2="0" /> 

Я хочу, чтобы получить все атрибуты, где значение> 0, и таким образом: «attribute1 = 10».

ответ

10

Первый вопрос: есть ли способ для получить имя атрибута узла?

<node attribute1="value1" attribute2="value2" />

Да: Это выражение XPath (когда node контекст (текущий) узел)):

        name(@*[1])

производит имя первого аттри Бьют (упорядочение может быть реализация - зависимой)

и это XPath-выражение (когда node контекст (текущий) узел)):

        name(@*[2])

производит имя второго атрибута (порядок может быть зависимым от реализации).

Второй вопрос: есть ли способ получить атрибуты и значения как пары значений? Ситуация следующая:

<node attribute1="10" attribute2="0" />

Я хочу, чтобы получить все атрибуты, где значение> 0, и таким образом: "attribute1 = 10".

Это выражение XPath (когда атрибут с именем "attribute1" контекст (текущий) узел)):

        concat(name(), '=', .)

производит строку:

        attribute1=value1

и это XPath-выражение (когда узел node контекст (текущий) узел)):

        @*[. > 0]

выбирает все атрибуты контекстный узел, значение которого является числом, больше 0.

В XPath 2.0 можно объединить их в одно выражение XPath:

        @*[number(.) > 0]/concat(name(.),'=',.)

, чтобы получить (в данном конкретном случае) этот результат:

        attribute1=10

Если вы используете XPath 1.0, который является менее мощным, вы будете нужно вставлять выражение XPath на языке хостинга, таких как XSLT. Следующий XSLT 1.0 thransformation:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 

    <xsl:template match="/*"> 
     <xsl:for-each select="@*[number(.) > 0]"> 
     <xsl:value-of select="concat(name(.),'=',.)"/> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

при нанесении на этом XML-документ:

<node attribute1="10" attribute2="0" /> 

производит точно такой же результат:

        attribute1=10

+0

FLOWR XPath 2 или будет 'для $ i в @ * [. > 0] return concat (local-name ($ i), "=", $ i) 'будет нормально для XPath 1.0? – TheConstructor

+0

@ TheConstructor, XPath 2.0 и более поздние версии. –

0

Это немного зависит от контекста, я считаю. В большинстве случаев я ожидаю, что вам придется запросить «@*», перечислить элементы и вызвать «name()» - но он может работать в некоторых тестах.

Re редактирования - вы можете сделать:

@*[number(.)>0] 

найти атрибуты, соответствующие Вашим критериям, а также:

concat(name(),'=',.) 

для вывода изображения. Хотя я не думаю, что вы можете сделать это одновременно. Какой здесь контекст? XSLT? что?

+0

Привет, Марк, спасибо за быстрый ответ. Есть ли способ получить атрибуты и имена как пары значений? Хм ... может, мне стоит отредактировать мой вопрос. – 2009-03-29 08:28:34

+0

Сегодня я использую библиотеку XFactorStudio XPath 1 и ActionScript 2. – 2009-03-29 08:49:06

+0

Тогда я считаю, что вам придется делать фильтр и проекцию отдельно (как указано выше, или проекция, подходящая для среды). –

3

//node/attribute::*

Пробовал с помощью веб-основе XPath Evaluator here.

Используйте XML, который вы хотите, имея предоставленный образец узла.
Поместите выражение XPath на страницу & нажмите на Eval.

Надеюсь, это поможет.

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