如何在XSLT中为if条件创建布尔变量?

时间:2019-04-03 09:03:29

标签: xslt

我想迭代一个列表节点,以检查每个节点字段是否与全局值匹配。 结果应写入布尔变量。而且只有在true(因此所有“段”都有效)的情况下,我才想继续我的逻辑。

<!-- TODO how to set mytest=true by default? -->
<xsl:variable name="mytest">
    <xsl:for-each select="Segment">
            <xsl:if test=".//SegmentField != $globalValue">
                    <!-- TODO how to set mytest = false? -->
            </xsl:if>
    </xsl:for-each>
</xsl:variable>

<xsl:if test="$mytest">
    <xsl:for-each select="Segment">
        ...creating a csv string
    </xsl:for-each>
</xsl:if>

或者,我可以检查$mytesttrue还是未定义,例如(pseudocode):

<xsl:if test="$mytest || not($mytest)">

但是如何?我的目标是简单地检查每个SegmentField中的所有Segment值是否相等。

示例:https://xsltfiddle.liberty-development.net/94rmq6i/1

<OuterElement>
    <SegmentWrapper>
        <Segment>
            <SegmentField>A</SegmentField>
        </Segment>
        <Segment>
            <SegmentField>A</SegmentField>
        </Segment>
    </SegmentWrapper>
    <SegmentWrapper>
        <Segment>
            <SegmentField>B</SegmentField>
        </Segment>
        <Segment>
            <SegmentField>B</SegmentField>
        </Segment>
    </SegmentWrapper>
    <SegmentWrapper>
        <Segment>
            <SegmentField>A</SegmentField>
        </Segment>
        <Segment>
            <SegmentField>B</SegmentField>
        </Segment>
    </SegmentWrapper>
</OuterElement>

XSLT:

  <xsl:template match="OuterElement">
    <xsl:for-each select="SegmentWrapper//Segment">
        <xsl:variable name="mytest" select="not(Segment[SegmentField != SegmentField[1]])" />

        <xsl:if test="$mytest">
            <xsl:value-of select=".//SegmentField" separator=";"/>
            <xsl:text>&#10;</xsl:text>
        </xsl:if>
    </xsl:for-each>
  </xsl:template>

这应该打印

A;A
B;B

1 个答案:

答案 0 :(得分:1)

在这种情况下,您应该可以将其简化为这样...

<xsl:variable name="mytest" select="not(Segment[SegmentField != $globalValue])" />

因此,表达式Segment[SegmentField != $globalValue])返回所有Segments,其中SegmentField与全局值不匹配。通过对此应用not,如果集合中有任何元素,则使用not将返回false,否则返回false。

编辑:要进行编辑,如果您要检查每个SegmentWrapper的所有SegmentField值是否相同,则可以这样定义变量

<xsl:variable name="mytest" select="not(Segment/SegmentField != Segment/SegmentField)" />

乍一看,这似乎很奇怪,因为您可能会认为Segment/SegmentField != Segment/SegmentField永远是错误的。但是Segment/SegmentField返回一个序列,当您对此进行比较时,如果第一个序列中的一个节点与第二个序列中的一个进行比较,它将返回true。

尽管您实际上并不需要该变量,您可以编写以下代码:

<xsl:template match="OuterElement">
  <xsl:for-each select="SegmentWrapper[not(Segment/SegmentField != Segment/SegmentField)]">
    <xsl:value-of select=".//SegmentField" separator=";"/>
    <xsl:text>&#10;</xsl:text>
  </xsl:for-each>
</xsl:template>