我想迭代一个列表节点,以检查每个节点字段是否与全局值匹配。
结果应写入布尔变量。而且只有在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>
或者,我可以检查$mytest
是true
还是未定义,例如(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> </xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
这应该打印
A;A
B;B
答案 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> </xsl:text>
</xsl:for-each>
</xsl:template>