xpath - Как заставить метод B работать? - PullRequest
0 голосов
/ 28 декабря 2011

Использование схемы метода A с xpath для чтения и сопоставления неограниченного узла («деталь») работает для вывода нескольких сообщений.Единственная проблема заключается в том, что при разработке схемы xsd неограниченный узел всегда должен быть в последовательности.В используемом объекте Message Assignment экземпляр XPath, который я пытаюсь прочитать и отобразить, имеет вид

XPathVar = System.String.Format(“
    /* [local-name()=’header’ and namespace-uri()=’http://namespace’]
    /* [local-name()=’detail’ and namespace-uri()=’http://namespace’] and 
    position() = {0}]”, nLoopCount)

Если у меня нет узла detail сразу после узла header, чем онне выдает исключение, похожее на ', содержащее нулевое значение в конце блока конструкции '.Есть ли способ заставить метод Б работать?то есть

Этот метод работает!

    [Method A]
    <schema>
       <header>  (Node)
           <detail> (Node) unbounded
             <child elements> 
           </detail>
           <additional info> (Node)
             <child elements>
           </additional info>
       </header>

, но это не работает и выдает исключение, похожее на 'содержащий нулевое значение в конце блока конструкции'

    [Method B]
    <schema>
      <header> (Node)
         <additional info> (Node)
            <child elements>
         </additional info>
         <detail> (Node) unbounded
            <child elements> 
         </detail>
      </header>

если в схеме есть другие элементы или узлы, разделяющие

и , я получаю ошибку исключения.

Может кто-нибудь пролить свет на эту проблему?

1 Ответ

1 голос
/ 28 декабря 2011

Я думаю , что вы хотите использовать это:

XPathVar = System.String.Format(“
    /* [local-name()=’header’ and namespace-uri()=’http://namespace’]
    /* [local-name()=’detail’ and namespace-uri()=’http://namespace’]
       [position() = {0}]”, nLoopCount)

Объяснение: Следующие часто выбирают эквивалентные наборы:

/*[condition1 and condition2]
/*[condition1][condition2]

Однако, это ломается при использовании position. Рассмотрим это выражение:

/*[condition1 and position()=1]

Выбирает все элементы, для которых оба из следующих имеют значение true:

  • condition1 верно
  • позиция контекста элемента равна единице

Однако это выражение:

/*[condition1][position()=1]

... first выбирает все элементы, для которых condition1 имеет значение true, а , а затем принимает первый такой элемент.

Это тонкое, но важное отличие.

...