xpath: объединить текст узла-брата - PullRequest
0 голосов
/ 16 марта 2012

Учитывая пример XML-данных:

<root>
  <a>
    <id>1</id>
    <status>on</status>
    <level>4</level>
    <otherData>asdfasdfsdfvasdF</otherData>
    <b>
        <name>A1</name>
    </b>
  </a>
  <a>
    <id>2</id>
    <status>on</status>
    <level>8</level>
    <otherData>asdfasdfsdfvasdF</otherData>
    <b>
        <name>TEST</name>
    </b>
  </a>
  <a>
    <id>3</id>
    <status>off</status>
    <level>2</level>
    <otherData>asdfasdfsdfvasdF</otherData>
    <b>
        <name>A1</name>
    </b>
  </a>
</root>

Я хотел бы написать выражение XPath, которое будет иметь оценку:

1 on
3 off

То есть я хотел бы извлечьтекст узла id и объединить его с узлом status.Есть дополнительное условие: я хочу сделать это только для случаев, когда name - «А1».Выражение XPath для получения id таково:

//name[text()="A1"]/../../id/text()

И вот попытка объединить id с его родным братом status, который не работает.

//name[text()="A1"]/../../concat(id/text() , status/text())

Возможно ли то, что я пытаюсь сделать?И если да, какое будет правильное выражение XPath?


Чтобы уточнить: я не делаю никаких преобразований с этим выражением, я просто подключаю его к оценщику выражений XPath (например, вNotepad ++ или JEdit - с помощью плагинов) для отладки незначительных ошибок данных в очень больших файлах XML.В этом примере некоторые комбинации id и status могут быть неправильными, если дочерний элемент b имеет name="A1", поэтому я пытаюсь найти их все с помощью одного простого выражения, а не прокручивать файл вручную.

Ответы [ 2 ]

2 голосов
/ 16 марта 2012

XPath 2.0:

for $n in /root/a[b/name[.='A1']] return concat($n/id, ' ' , $n/status) 

Результат:

1 on
3 off

Проверено в Oxygen XML Editor , очень хороший инструмент ИМХО.

0 голосов
/ 16 марта 2012

Попробуй это. Вам просто нужно добавить желаемое форматирование)

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:template match="root">
    <xsl:apply-templates select="//name[text()='A1']"></xsl:apply-templates>
  </xsl:template>
  <xsl:template match="name[text()='A1']">
      <xsl:value-of select="../../id"/>
      <xsl:text> </xsl:text>
    <xsl:value-of select="../../status"/>
  </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...