Сохранить условие теста в переменной - PullRequest
0 голосов
/ 30 сентября 2019

Я совершенно новый в XSLT и мне нужно преобразовать адрес XML-файла. Мне нужно сохранить результат проверки условия в переменной, я хочу использовать его позже в том же шаблоне.

Здесь мой исходный код xml:

<?xml version="1.0" encoding="UTF-8"?>
<message>
<partner>
    <addressInfo>
        <addressUsage>
            <Code>Default</Code>
            <Main>false</Main>
        </addressUsage>
        <addressUsage>
            <Code>BILL_TO</Code>
            <Main>false</Main>
        </addressUsage>
        <Address>...</Address>
    </addressInfo>
    <addressInfo>
        <addressUsage>
            <Code>SHIP_TO</Code>
            <Main>false</Main>
        </addressUsage>
        <addressUsage>
            <Code>BILL_TO</Code>
            <Main>true</Main>
        </addressUsage>
        <Address>...</Address>
    </addressInfo>
</partner>
</message>

Теперь мне нужнознать, есть ли адрес с кодом "BILL_TO" и Main = "true". Мне нужно хранить это в переменной. Но в моем тесте я всегда терплю неудачу.

Здесь мой XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

<!-- copy all nodes and attributes -->  
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>


<xsl:template match="partner">
    <partner>
    <xsl:variable name="main_bill_to">
        <xsl:choose>
            <xsl:when test="(./addressInfo/addressUsage/Code = 'BILL_TO' and Main = 'true')">
                <xsl:value-of select="'Y'" />
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="'N'" />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable> 

    <xsl:if test="($main_bill_to = 'Y')">
        <result>yes</result>
    </xsl:if>

    <xsl:if test="($main_bill_to = 'N')">
        <result>no</result>
    </xsl:if>
    </partner>
</xsl:template>
</xsl:stylesheet>

Я всегда получаю вывод "нет".

<message>
    <partner>
       <result>no</result>
    </partner>
</message>

Есть идеи? Большое спасибо!

1 Ответ

1 голос
/ 30 сентября 2019

Это выражение не совсем верно ...

<xsl:when test="(./addressInfo/addressUsage/Code = 'BILL_TO' and Main = 'true')">

Вы на самом деле спрашиваете " Есть ли элемент addressInfo/addressUsage/Code (ниже partner), равный 'BILL_TO', и этотам также элемент Main (ниже partner), равный 'true'".

Другими словами, он ищет элемент с именем Main в partner, а не втот же addressUsage, что и элемент Code, который вы проверяете.

Вам нужно сделать это ...

<xsl:when test="addressInfo/addressUsage[Code = 'BILL_TO' and Main = 'true']">

Итак, теперь спрашивается " Есть лиэлемент addressInfo/addressUsage, в котором для Code установлено значение 'BILL_TO' и для Main установлено значение 'true'"?

Обратите внимание, что ./ на самом деле не является необходимым, поэтому яудалите его.

Также обратите внимание, что вам не нужно особо разбираться в том, чтобы использовать xsl:choose для установки переменной в "Y" или "N". В этом случае вы можете упростить блок кода до этого ....

<xsl:template match="partner">
  <partner>
    <xsl:variable name="main_bill_to" select="addressInfo/addressUsage[Code = 'BILL_TO' and Main = 'true']" />

    <xsl:if test="$main_bill_to">
        <result>yes</result>
    </xsl:if>

    <xsl:if test="not($main_bill_to)">
        <result>no</result>
    </xsl:if>
  </partner>
</xsl:template>

Итак, теперь вы проверяете, существует ли элемент, чтобы определить, что отображать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...