Проблема при запуске запроса xpath с пространствами имен - PullRequest
7 голосов
/ 27 сентября 2010

Я пытаюсь использовать выражение xpath для выбора набора узлов в документе xml с определенными различными пространствами имен.

XML выглядит примерно так:

<?POSTEN SND="SE00317644000" REC="5566420989" MSGTYPE="EPIX"?>
<ns:Msg xmlns:ns="http://www.noventus.se/epix1/genericheader.xsd">
  <GenericHeader>
    <SubsysId>1</SubsysId>
    <SubsysType>30003</SubsysType>
    <SendDateTime>2009-08-13T14:28:15</SendDateTime>
  </GenericHeader>
  <m:OrderStatus xmlns:m="http://www.noventus.se/epix1/orderstatus.xsd">
    <Header>
      <OrderSystemId>Soda SE</OrderSystemId>
      <OrderNo>20090811</OrderNo>
      <Status>0</Status>
    </Header>
    <Lines>...

Я хочу выбрать только узлы "Msg", имеющие дочерний элемент "OrderStatus", и поэтому я хочу использовать следующее выражение xpath: / Msg [count ('OrderStatus')> 0], но это не будет работать, так как Я получаю сообщение об ошибке: «Требуется менеджер пространства имен или XsltContext. Этот запрос имеет префикс, переменную или пользовательскую функцию».

Так что я думаю, что хочу использовать выражение, которое выглядит примерно так: / * [local-name () = 'Msg'] [count ('OrderStatus')> 0], но, похоже, это не работает. какие-нибудь идеи?

Br,

Andreas

1 Ответ

10 голосов
/ 03 октября 2010

Я хочу использовать следующий xpath выражение:

/Msg[count('OrderStatus')[ 0]

но это не сработает, так как я получаю сообщение об ошибке: «Пространство имен Требуется менеджер или XsltContext.

Это часто задаваемые вопросы.

В XPath имя без префикса всегда считается принадлежащим «без пространства имен».

Однако элементы, которые вы хотите выбрать, на самом деле находятся в "http://www.noventus.se/epix1/genericheader.xsd" Пространство имен.

У вас есть два возможных способа написания выражения XPath :

  1. Используйте возможности языка хостинга для привязки префиксов ко всем различным пространствам имен, которым принадлежат имена из выражения. Вы не указали язык хостинга в этом конкретном случае, поэтому я не могу вам с этим помочь. Пример C # можно найти здесь .

Если вы связали префикс "xxx" с пространством имен "http://www.noventus.se/epix1/genericheader.xsd" и префикс "yyy" с пространством имен "http://www.noventus.se/epix1/orderstatus.xsd", то ваше выражение может быть записано как:

/xxx:Msg[yyy:OrderStatus]

: 2: Если вы вообще не хотите использовать какие-либо префиксы, выражение XPath все равно можно создать, однако оно не будет слишком читабельным:

/*[local-name() = 'Msg' and *[local-name() = 'OrderStatus']]

Наконец, обратите внимание :

  1. Чтобы проверить, есть ли у элемента x дочерний элемент y, нет необходимости проверять положительный count(y). Просто используйте : x[y]

  2. Позиции Xpath основаны на 1 . Это означает, что NodeSetExpression[0] никогда не выбирает узел. Вы хотите: NodeSetExpression[1]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...