Я пытаюсь получить Xpath для значения, но получаю ошибку для вложенного условия
Я пытаюсь найти выражение XPath с предикатом для значения 1900310 из нескольких ViewItem, задав условию уникальное значение U003_O100_001T_609644. Пожалуйста, смотрите код ниже,
<Б: ViewItem>
<Б: Поля>
<С: KeyValueOfstringanyType>
<С: Key> ID с: Key>
С: KeyValueOfstringanyType>
<С: KeyValueOfstringanyType>
<С: Key> Подтип с: Key>
<С: Value> U003_O100_00IT_609644 с: Значение>
С: KeyValueOfstringanyType>
<С: KeyValueOfstringanyType>
<С: Key> SectionType с: Key>
<С: Value> Выпущенный с: Значение>
С: KeyValueOfstringanyType>
Б: Fileds>
Б: ViewItem>
Я попытался написать выражение следующим образом:
Запрос = / Конверт / Тело / GetViewByIdResponse / GetViewByIdResult / Продукты / ViewItem / Поля /KeyValueOfstringanyType[Value='U003_O100_001T_609644']/Value[Key='ID']
Но это не дает мне ценность. Можете ли вы помочь?
Спасибо1 ответ
Одно выражение 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>