Я пытаюсь получить Xpath для значения, но получаю ошибку для вложенного условия - PullRequest
2 голосов
/ 13 февраля 2012

Я пытаюсь найти выражение XPath с предикатом для значения 1900310 из нескольких ViewItem, задав условию уникальное значение U003_O100_001T_609644. Пожалуйста, смотрите код ниже,

<с: Key> ID </ с: Key>

1900310 </ c: Значение>

</ c: KeyValueOfstringanyType>

SubType </ c: Key>

<с: Value> U003_O100_00IT_609644 </ с: Значение>

</ c: KeyValueOfstringanyType>

SectionType </ c: Key>

<с: Value> Выпущенный </ с: Значение>

</ c: KeyValueOfstringanyType>

</ б: Fileds>

</ б: ViewItem>

Я попытался написать выражение следующим образом,

Запрос = / Конверт / Тело / GetViewByIdResponse / GetViewByIdResult / Элементы / ViewItem / Поля / KeyValueOfstringanyType [Значение = 'U003_O100_001T_609644'] / Значение [Ключ = 'ID']

Но это не дает мне ценности. Можете ли вы помочь?

Спасибо

1 Ответ

2 голосов
/ 14 февраля 2012

Одно выражение XPath, которое выбирает требуемый элемент: :

 /b:ViewItem
    /b:Fields
       /c:KeyValueOfstringanyType
          [c:Key = 'ID']
                   /c:Value

Обратите внимание , что в предоставленном XML-документе есть пространства имен, и любое выражение XPath, содержащее имена элементов без префикса, не будет выбирать требуемый элемент, за исключением выражений следующей формы:

 /*[local-name() = 'ViewItem']
    /*[local-name() = 'Fields']
       /*[local-name() = 'KeyValueOfstringanyType']
               [*[local-name() = 'Key'] = 'ID']
                   /*[local-name() = 'Value']

Кроме того, для первого выражения XPath, указанного выше, пространства имен с префиксом "b:" и "c:" должно быть "зарегистрировано" (прочитайте документацию вашего движка XPath, как это сделать).

Проверка на основе XSLT :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:b="some:b" xmlns:c="some:c">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "/b:ViewItem
        /b:Fields
           /c:KeyValueOfstringanyType
              [c:Key = 'ID']
                /c:Value
    "/>

==============

  <xsl:copy-of select=
   "/*[local-name() = 'ViewItem']
         /*[local-name() = 'Fields']
               /*[local-name() = 'KeyValueOfstringanyType']
                    [*[local-name() = 'Key'] = 'ID']
                            /*[local-name() = 'Value']
   "/>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование XSLT применяется к следующему XML-документу (предоставленному с поправкой на серьезную деформацию):

<b:ViewItem xmlns:b="some:b" xmlns:c="some:c">
    <b:Fields>
        <c:KeyValueOfstringanyType>
            <c:Key>ID</c:Key>
            <c:Value>1900310 </c:Value>
        </c:KeyValueOfstringanyType>
        <c:KeyValueOfstringanyType>
            <c:Key>SubType</c:Key>
            <c:Value>U003_O100_00IT_609644</c:Value>
        </c:KeyValueOfstringanyType>
        <c:KeyValueOfstringanyType>
            <c:Key>SectionType</c:Key>
            <c:Value>Released</c:Value>
        </c:KeyValueOfstringanyType>
    </b:Fields>
</b:ViewItem>

Оцениваются два выражения XPath и выводятся выбранные ими узлы :

<c:Value xmlns:c="some:c" xmlns:b="some:b">1900310 </c:Value>

==============

<c:Value xmlns:c="some:c" xmlns:b="some:b">1900310 </c:Value>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...