Как создать логическую переменную для if-условий в XSLT? - PullRequest
0 голосов
/ 03 апреля 2019

Я хочу перебрать узел списка, чтобы проверить, соответствует ли каждое поле узла глобальному значению.Результат должен быть записан в логическую переменную.И только если это 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 или не определено, например (псевдокод):

<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 Ответ

1 голос
/ 03 апреля 2019

В этом случае вы сможете упростить его до этого ...

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

Итак, выражение Segment[SegmentField != $globalValue]) возвращает все Segments, где SegmentField не соответствует глобальномузначение.Применяя not к этому, если в наборе есть какие-либо элементы, то использование not вернет false, в противном случае возвращается false.

EDIT: В ответ на ваши изменения, если вы хотите проверитьвсе значения SegmentField были одинаковыми для каждого SegmentWrapper, вы должны определить свою переменную следующим образом:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...