2016-06-08 1 views
0

У меня есть условие, когда мне нужно петлю по крайней мере один раз, и поэтому у меня есть следующий код xsl. Однако это не работает, так как оно всегда получает последнее значение итераций. Как я могу настроить это, чтобы получить правильную итерацию в каждом цикле?Зацикливание через xpath, получая правильную итерацию каждый раз в xslt 2

<xsl:variable name='count0'> 
    <xsl:choose> 
    <xsl:when test='count($_BoolCheck/BoolCheck[1]/CheckBoolType) = 0'> 
     <xsl:value-of select="1"/> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select='count($_BoolCheck/BoolCheck[1]/CheckBoolType)'/> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 
<xsl:for-each select="1 to $count0"> 
    <xsl:variable name='_LoopVar_2_0' select='$_BoolCheck/BoolCheck[1]/CheckBoolType[position()=$count0]'/> 
    <e> 
    <xsl:attribute name="n">ValueIsTrue</xsl:attribute> 
    <xsl:attribute name="m">f</xsl:attribute> 
    <xsl:attribute name="d">f</xsl:attribute> 
    <xsl:if test="(ctvf:isTrue($_LoopVar_2_0/CheckBoolType[1]))"> 
     <xsl:value-of select="&quot;Value True&quot;"/> 
    </xsl:if> 
    </e> 
</xsl:for-each> 

файл XML выглядит следующим образом:

<BoolCheck> 
<CheckBoolType>true</CheckBoolType> 
<CheckBoolType>false</CheckBoolType> 
<CheckBoolType>1</CheckBoolType> 
<CheckBoolType>0</CheckBoolType> 
<CheckBoolType>True</CheckBoolType> 
<CheckBoolType>False</CheckBoolType> 
<CheckBoolType>TRUE</CheckBoolType> 
<CheckBoolType>FALSE</CheckBoolType> 
</BoolCheck> 

В этом случае мне нужно итерации по каждой итерации CheckBoolType и производят соответствующее количество значений. Однако в приведенном выше примере, если не было итераций CheckBoolType, мне все равно хотелось бы, чтобы итерации вводили каждый цикл по крайней мере один раз. Я надеюсь, что это еще раз пояснит.

+0

Возможно, вам захочется показать нам образец ввода XML и соответствующий результат, который вы хотите создать, объясняя взаимосвязь между двумя образцами. Затем вы также можете показать минимальный, но полный образец кода XSLT вместе с полученным результатом. –

+0

Я думаю, что получил ответ на это, мне просто нужно было объявить переменную внутри каждого из них:

+0

Контекстный элемент внутри for-each с '1 to ...' является целым числом, поэтому ' ' просто записывается как « '. Но 'for-each' не является циклом и нужны ли вам все эти переменные, я не уверен, я до сих пор не понял, чего вы хотите достичь. –

ответ

0

Первое наблюдение: ваша декларация $ count0 можно заменить

<xsl:variable name="temp" select="count($_BoolCheck/BoolCheck[1]/CheckBoolType)"/> 
<xsl:variable name="count0" select="if ($temp=0) then 1 else $temp"/> 

(Извините, если это кажется неуместным, но мой первый шаг в отладке кода всегда упрощать Это делает ошибки гораздо проще. найти).

Если вы сделаете это, вы можете безопасно заменить предикат [position()=$count0] на [$count0], так как $ count0 теперь является целым числом, а не узлом документа. (Еще лучше, если объявить его как целое число, используя as='xs:integer' на xsl:variable декларации.)

Но подожди, $count0 это количество элементов обрабатываемый, поэтому CheckBoolType[$count] всегда будет выбирать последний. Это не то, что вы хотите.

Это приводит нас к еще одной ошибке в вашем коде. Значение переменной $_LoopVar_2_0 является узлом элемента с именем CheckBoolType. Выражение $_LoopVar_2_0/CheckBoolType[1] ищет детей этого элемента, которые также называются CheckBoolType. Таких детей нет, поэтому выражение выбирает пустую последовательность, поэтому логический тест всегда ложный.

На этом этапе я хотел бы показать вам правильный код для достижения желаемого результата. К сожалению, вы не показали нам желаемого результата. Я не могу переработать требование из (а) вашего неправильного кода и (б) вашего описания прозы алгоритма, который вы пытаетесь реализовать.

+0

Я просто пытался понять, как получить текущую итерацию в цикле for-each, но вы делаете некоторые полезные которые выявили другие ошибки в коде. –

+0

У меня есть другая ситуация, которая похожа, но я не уверен, почему это не работает. Внутри цикла for-each у меня есть условие вроде и триммирование определяется как . Я продолжаю получать последовательность из более чем одного элемента, которая не разрешается заменять, но я не знаю, как ее передача в нескольких узлах? –

+0

Я не могу отладить его от этого, но первое, что нужно сделать, это сформировать привычку объявлять ваши типы данных в xsl: variable и xsl: param. Это значительно облегчит диагностику типов, поскольку обнаружение приближается к источнику ошибки. –

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