2012-06-29 3 views
0

Я должен вырваться из for-each цикла, если @PercentOfAmountActive не равен 0 или 100.Перерыв из каждого цикла в XSLT

Это мой XML:

<SamplePointSet Id="1" StartDate="2012-01-01T04:00:00Z" CalendarId="1" Cyclic="6" ForAttribute="0" ObjectId="0" ProbabilityFunctionId="0" TableNumber="0" TimePeriodId="4" ParentId="1"> 
    <SamplePoint NumberOfActiveTimePeriods="30" PercentOfAmountActive="100" Sequence="1" SamplePointSetId="1" /> 
    <SamplePoint NumberOfActiveTimePeriods="30" PercentOfAmountActive="0" Sequence="2" SamplePointSetId="1" /> 
    <SamplePoint NumberOfActiveTimePeriods="30" PercentOfAmountActive="100" Sequence="3" SamplePointSetId="1" /> 
    <SamplePoint NumberOfActiveTimePeriods="30" PercentOfAmountActive="0" Sequence="4" SamplePointSetId="1" /> 
    <SamplePoint NumberOfActiveTimePeriods="30" PercentOfAmountActive="100" Sequence="5" SamplePointSetId="1" /> 
    <SamplePoint NumberOfActiveTimePeriods="30" PercentOfAmountActive="0" Sequence="6" SamplePointSetId="1" /> 
    <SamplePoint NumberOfActiveTimePeriods="30" PercentOfAmountActive="100" Sequence="7" SamplePointSetId="1" /> 
    <SamplePoint NumberOfActiveTimePeriods="30" PercentOfAmountActive="0" Sequence="8" SamplePointSetId="1" /> 
    <SamplePoint NumberOfActiveTimePeriods="30" PercentOfAmountActive="100" Sequence="9" SamplePointSetId="1" /> 
    <SamplePoint NumberOfActiveTimePeriods="30" PercentOfAmountActive="0" Sequence="10" SamplePointSetId="1" /> 
    <SamplePoint NumberOfActiveTimePeriods="30" PercentOfAmountActive="100" Sequence="11" SamplePointSetId="1" /> 
    <SamplePoint NumberOfActiveTimePeriods="30" PercentOfAmountActive="0" Sequence="12" SamplePointSetId="1" /> 
    </SamplePointSet> 

Ниже код XSLT

<xsl:for-each select=".../CM:SamplePointSet/CM:SamplePoint"> 
    <xsl:variable name="varActiveTimePeriod" select="./@NumberOfActiveTimePeriods * $varMultiple"/> 
    <xsl:variable name="varPercentOfAmountActive" select="./@PercentOfAmountActive"/> 

    <!-- . . . some Condition To break if (percent of amount active) not 0 or 100 --> 

    <xsl:value-of select="CMXsltExtObject:SetRecurenceRule($varActiveTimePeriod, $varPercentOfAmountActive, $varCalendarFrequency)"/> 
</xsl:for-each> 

Есть ли способ сделать это?

ответ

3

Избегайте для каждого цикла в XSLT. Вместо этого, где это возможно, примените ваши узлы к шаблонам, используя XPath для таргетинга только тех узлов, которые подходят.

Вы можете добиться эффекта разрыва путем применения шаблонов только к тем узлам ...

  • которого @PercentOfAmountActive атрибут равен 0 или 100
  • ни один из которых предшествующее братья и сестры имеют атрибут @PercentOfAmountActive, который не является равным 0 или 100.

Вот упрощенный пример, который вы можете использовать в this XMLPlayground.

XML

<root> 
    <node attr='0'>hello 1</node> 
    <node attr='100'>hello 2</node> 
    <node attr='0'>hello 3</node> 
    <node attr='100'>hello 4</node> 
    <node attr='1'>hello 5</node> 
    <node attr='0'>hello 6</node> 
    <node attr='100'>hello 7</node> 
</root> 

XSLT

<xsl:template match='/'> 
    <ul> 
     <xsl:apply-templates select='root/node[(@attr = 0 or @attr = 100) and not(preceding-sibling::*[@attr != 0 and @attr != 100])]' /> 
    </ul> 
</xsl:template> 

<xsl:template match='node'> 
    <li><xsl:value-of select='.' /></li> 
</xsl:template> 

только первые четыре узла выводятся, имитируя эффект 'разрыва', как только мы попали в узел, который был непригоден.

2

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

наиболее эффективным решением является, вероятно, использовать родственный рекурсии:

<xsl:template match="SamplePointSet"> 
    <xsl:apply-templates select="SamplePoint[1]"/> 
</xsl:template> 

<xsl:template match="SamplePoint"> 
    ... some processing ... 
    <xsl:if test="@A = 1 or @A = 100"> 
    <xsl:apply-templates select="following-sibling::SamplePoint[1]"/> 
    </xsl:if> 
</xsl:template> 
+0

Я хочу, что если какое-либо значение, отличное от 0 или 100 приходит, чем выйти из этого для каждого и в дальнейшем не обрабатывается ... – Hussey

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