Сводный синтаксис пространства имен, который я видел вокруг, сбивает меня с толку.
Во-первых, я бы посоветовал вам не использовать этот синтаксис, особенно если этосбивает с толку.Это также может привести к ошибкам - подробности см. В конце моего ответа.
Стандартный способ указать имена выражений XPath, которые находятся в пространстве имен, - это зарегистрировать пространство имен с помощью вашего механизма XPath (см.соответствующая документация для конкретного поставщика), а затем использовать префикс, связанный с зарегистрированным пространством имен (скажем, «x») с именами, такими как x:someName
. На эту тему есть много хороших ответов - не используйтеодин из них.
Теперь, если по какой-то причине вы все-таки решили использовать запутанный синтаксис, то:
но я борюсь с такими вещами:
/root/parent[@attribute="A"]/child/text()
Используйте :
/*[local-name()='root']/*[local-name()='parent' and @attribute='A']
, затем:
или:
/root/parent[text()="B"]/child/text()
Используйте :
/*[local-name()='root']/*[local-name()='parent' and text()='B']
/*[local-name()='child']/text()
затем:
или:
/root/parent[1]/child/text()
Использование :
/*[local-name()='root']/*[local-name()='parent'][1]
/*[local-name()='child']/text()
затем:
Еще один: -)
<root>
<parent>
<childName>serverName</childName>
<childValue>MyServer</childValue>
</parent>
<parent>
<childName>ServerLocation</childName>
<childValue>Somewhere</childValue>
</parent>
</root>
Как это переводится?
/root/parent[childName="serverName"]/childValue/text()
Использование :
/*[local-name()='root']
/*[local-name()='parent'][*[local-name()='childName"]='serverName']
/*[local-name()='childValue']/text()
Примечание :
Такие выражения могут не выбирать нужные узлы, если в документах XML есть элементы с тем же локальным именем, которые принадлежатдва разных пространства имен.