2014-10-22 6 views
0

Итак, я пытался понять, почему XPath не возвращает правильные значения, когда я ввожу то, что кажется правильным (синтаксис мудрый).Функция XSL: position() и подсчет: неточные результаты

Целью здесь является создание метки Gs1, которая отображает общее количество «контейнеров», а какой контейнер является текущим контейнером. (Контейнер {i} of {total})

В этом конкретном примере каждый цикл проходит через раздел ASNShipmentContainers и понимает, что в ASNShipmentContainers имеется 6 ASNShipmentContainer и поэтому выводит 6 разных меток.

Я понял, что функция position() будет лучшим способом вернуть, в какую итерацию мой цикл foreach включен. Я googled вверх и вниз, и понял, что это будет самый простой и правильный способ сделать это. Но при его реализации он постоянно возвращает «1» на каждую метку вместо увеличения.

Кроме того, когда я пытаюсь найти значение для всех контейнеров, я использую: count (ASNShipmentContainers/ASNShipmentContainer), который совпадает с тем, что объявлено в цикле foreach, и должно вернуть значение моего общего контейнера 6. Но это также возвращает 1.

Вот соответствующий код:

<xsl:variable name="ROOT" select="." /> 
<!--For each loop, knows there are 6 iterations--> 
<xsl:for-each select="ASNShipmentContainers/ASNShipmentContainer"> 

    <Section Margins="5,5"> 


      <!--Start creation of table that will display info here--> 
      <Table Width="275" Height="30" Margins="161,0,0,0"> 
      <Row Height="100%"> 
       <Cell Borders="Black" Width=".125"/> 
        <Cell Width="274.375"> 
         <Text>Count:<xsl:value-of select="position()" /> of <xsl:value-of select="count(ASNShipmentContainers/ASNShipmentContainer))" /></Text> 
        </Cell> 
       <Cell Borders="Black" Width=".5"/> 
       </Row> 
      </Table> 


</Section> 

</xsl:for-each> 

Так почему же значение позиции и общего количества контейнеров как «1», когда я делаю это. Я понимаю, что позиция должна работать, даже если она вызывается внутри цикла for-each.

Кроме того, если бы я попросил подсчет Контейнеров, не должен ли я получить общее количество? Почему это дало бы мне 1.

Единственное, что я могу себе представить, это то, что каким-то образом область видимости отключена для моих операторов цикла/выбора. Это потребует другого использования?

Редактировать: Спасибо за ваши быстрые ответы, но проблема действительно не связана с XSL. После того, как он наконец работал с тем, кто использовал этот код раньше, он объяснил мне, что проблема исходила из нашего кода на C#, а не из самого XSL. C# удалит все элементы, над которыми он не работал, поэтому каждый раз, когда я пытался подсчитать все элементы, это дало бы мне один, потому что технически было только одно.

Спасибо.

+0

Пожалуйста, включите пример ввода и ожидаемый выход. –

+0

Просьба показать образец ввода и показать нам также весь шаблон, чтобы мы могли видеть, что является узлом контекста. –

+0

Обратите внимание, что ваше выражение: 'count (ASNShipmentContainers/ASNShipmentContainer))' недействительно (несбалансированные круглые скобки) - так что вы не смогли получить результаты, которые вы требуете, используя этот код. –

ответ

2

Когда вы находитесь в контексте:

<xsl:for-each select="ASNShipmentContainers/ASNShipmentContainer"> 

выражение:

count(ASNShipmentContainers/ASNShipmentContainer) 

пытается сосчитать ASNShipmentContainer элементы, которые являются потомками ASNShipmentContainers, которые являются потомками текущего узла. Я не думаю, что это то, что ты хочешь.

Рассчитывать на текущем уровне в ASNShipmentContainer элементы, попробуйте:

count(../ASNShipmentContainer) 

или - предпочтительно - определить переменную с графом до того вызова for-each для того, чтобы избежать повторных отсчеты одно и то же.

Не знаете, в чем проблема с положением() - вам придется опубликовать более полный пример, чтобы мы могли воспроизвести проблему.

+0

Спасибо. Это было то, что я пытался подсчитать (№ ASNShipmentContainer.) Я понял вопрос, но он был полностью не связан с xsl. – TheTimes

Смежные вопросы