0

が 0 または 100 に等しくないfor-each場合は、ループから抜け出さなければなりません。@PercentOfAmountActive

これは私の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>

それを行う方法はありますか?

4

2 に答える 2

3

XSLT で for-each ループを回避します。代わりに、可能であればノードをテンプレートに適用し、XPath を使用して適切なノードのみをターゲットにします。

これらのノードにのみテンプレートを適用することで、ブレーク効果を実現できます...

  • 属性が@PercentOfAmountActive0 または 100 に等しい
  • 前の兄弟のいずれも、@PercentOfAmountActive0 または 100 に等しくない属性を持っていません。

この 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>

最初の 4 つのノードのみが出力され、不適切なノードにヒットすると「ブレーク」効果がシミュレートされます。

于 2012-06-29T10:02:00.810 に答える
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>
于 2012-06-29T11:31:06.093 に答える