XSLT добавить заданное значение в возвращаемую числовую переменную - PullRequest
0 голосов
/ 30 апреля 2020

Это должно быть довольно просто, но после 3 часов поисков в Интернете у меня, по-видимому, нет правильной формулировки, чтобы найти ответ.

У меня есть и XML возвращает, что мне нужно отформатировать для страница. У меня нет контроля над возвратом, поскольку он поступает из баз данных UPS.

У меня он отлично отформатирован, но теперь мне нужно увеличить ставку возврата на 4 доллара. Это должно быть легко, но я очень новичок во всем этом и в полной потере.

Вот соответствующая часть возвращенного XML:

<Response>
<ResponseStatusCode>1</ResponseStatusCode>
<ResponseStatusDescription>Success</ResponseStatusDescription></Response>
<RatedShipment>
    <Service><Code>03</Code></Service>
    <TotalCharges>
        <CurrencyCode>USD</CurrencyCode>
        <MonetaryValue>21.17</MonetaryValue></TotalCharges>
    </RatedShipment>
</Response>

Вот соответствующая часть формата XSL:

<xsl:template match="/">
<select name="shipping_options" id="shipping_options">
    <xsl:for-each select="/RatingServiceSelectionResponse/RatedShipment">
      <xsl:choose>
        <xsl:when test="Service/Code = 01">
            <xsl:element name="option">
                <xsl:attribute name='value'>
                    1!!!
                    <xsl:value-of select="TotalCharges/MonetaryValue"/>
                </xsl:attribute>
                UPS Next Day Air - $
                <xsl:value-of select="format-number(TotalCharges/MonetaryValue, '###,###.00')"/>
            </xsl:element>
        </xsl:when>
      </xsl:choose>
    </xsl:for-each>
</select>

Редактировать: формат для XSL будет правильным для других нужд позже. Желаемый конечный результат выглядит следующим образом:

<select name="shipping_options" id="shipping_options">
    <option value="">Enter Zip Code To Update</option>
    <option value="1!!!77.49">UPS Next Day Air - $77.49</option>
    <option value="2!!!51.20">UPS 2nd Day Air - $51.20</option>
    <option value="3!!!22.73">UPS Ground - $22.73</option>
    <option value="4!!!38.01">UPS 3 Day Select - $38.01</option>
    <option value="5!!!71.02">UPS Next Day Air Saver - $71.02</option>
    <option value="6!!!108.01">UPS Next Day Air Early - $108.01</option>
    <option value="8!!!0.00">Please call for freight pricing - $0.00</option>
    <option value="9!!!0.00">Please call for international pricing - $0.00</option>
        </select>

Правка # 2: это было буквально так же просто, как и должно было быть. Просто нужно было изменить этот бит, чтобы добавить «+4»:

select="format-number(TotalCharges/MonetaryValue + 4, '###,###.00')"

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Сначала некоторые предположения.

  1. Ваш XML файл имеет <Response> как root тег, но ваш XSL-код ссылается на /RatingServiceSelectionResponse: я полагаю, это должно быть /Response.
  2. . test test="Service/Code = 01" должен быть test="Service/Code = '01'" с кавычками.
  3. Если вы хотите поэкспериментировать, ваш файл XML должен содержать текст 01 вместо 03 под тегом <code>. В противном случае ваш код ничего не сделает.

В этом случае вам нужно добавить 4 внутри выражения format-number(TotalCharges/MonetaryValue + 4, '###,###.00')

Между тем Себастьян ответил точно так же, как и я ...

1 голос
/ 30 апреля 2020

Вы можете попробовать это так: (Я изменил ваш ввод XML, некоторые из них были некорректны.)

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

  <xsl:output method="html" indent="yes"/>

    <xsl:template match="/">
        <select name="shipping_options" id="shipping_options">
            <xsl:for-each select="Response/RatingServiceSelectionResponse/RatedShipment">
              <xsl:choose>
                <xsl:when test="Service/Code = '01'">
                    <xsl:element name="option">
                        <xsl:attribute name="value">UPS Next Day Air - $</xsl:attribute>
                        <xsl:value-of select="format-number(TotalCharges/MonetaryValue + 4, '###,###.00')"/>
                    </xsl:element>
                </xsl:when>
              </xsl:choose>
            </xsl:for-each>
        </select>
    </xsl:template>

</xsl:stylesheet>

Смотрите, как это работает здесь: https://xsltfiddle.liberty-development.net/ehVZvvX

Добавление от Michael Kay : инструкция xsl:for-each может быть упрощена до

<xsl:for-each select="Response/RatingServiceSelectionResponse/RatedShipment[Service/Code = '01']">
  <option value="UPS Next Day Air - ${format-number(TotalCharges/MonetaryValue + 4, '###,###.00')}"/>
</xsl:for-each>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...