Добрый день!
Имеется код, взятый с wiki.umisoft.ru, для отправки уведомлений с разным текстом при изменении статуса заказа и доставки:
<xsl:template match="status_notification">
<br />
<xsl:text>Ваш заказ № </xsl:text>
<xsl:value-of select="order_number" />
<xsl:text> </xsl:text>
<xsl:choose>
<!-- Уведомления о статусе заказа -->
<xsl:when test="contains(status, 'поступил в обработку')">
был получен.
</xsl:when>
<xsl:when test="contains(status, 'отменён')">
был отменен.
</xsl:when>
<xsl:when test="contains(status, 'отклонён')">
был отклонен.
</xsl:when>
<xsl:when test="contains(status, 'доставляется')">
доставляется.
<xsl:if test="document(concat('uobject://',order_id,'.delivery_service_id'))//value">
<xsl:apply-templates select="document(concat('uobject://',order_id))/udata" mode="delivery_link" />
</xsl:if>
</xsl:when>
<xsl:when test="contains(status, 'готов')">
готов.
</xsl:when>
<xsl:when test="contains(status, 'принят')">
принят.
</xsl:when>
<xsl:when test="contains(status, 'оплачивается')">
оплачивается.
</xsl:when>
<xsl:when test="contains(status, 'редактируется')">
редактируется.
</xsl:when>
<!-- Уведомления о статусе оплаты -->
<xsl:when test="contains(status, 'ожидает оплаты')">
ожидает оплаты.
</xsl:when>
<xsl:when test="contains(status, 'оплачен')">
был оплачен.
</xsl:when>
<xsl:when test="contains(status, 'обновлен: оплата подтверждена')">
был обновлен, оплата подтверждена.
</xsl:when>
<xsl:when test="contains(status, 'обновлен: оплата отклонена')">
был обновлен, оплата отклонена.
</xsl:when>
<!-- Уведомления о статусе доставки -->
<xsl:when test="contains(status, 'ожидает отгрузки')">
ожидает отгрузки.
</xsl:when>
<xsl:when test="contains(status, 'доставляется')">
отправлен.
</xsl:when>
<xsl:when test="contains(status, 'доставлен')">
доставлен.
</xsl:when>
</xsl:choose>
<br/><br/>
<xsl:text>Посмотреть историю заказов и самостоятельно отслеживать этапы доставки заказа Вы можете в своем </xsl:text>
<a href="http://{domain}/users/login/">
<xsl:text>личном кабинете</xsl:text>
</a> в разделе <a href="http://{domain}/emarket/ordersList/" target="_blank"><xsl:text>"Мои заказы"</xsl:text></a>.<br />
</xsl:template>
Все работает нормально за исключением того момента, условие <xsl:if test="document(concat('uobject://',order_id,'.delivery_service_id'))//value"> в статусе "Доставляется" никак не обрабатывается, точнее как-будто test всегда = true, хотя это не так. Никак не могу понять в чем причина такого поведения? Может кто сталкивался с подобной ситуацией?
P.S. При смене статуса доставки заказа на "Доставляется" почему-то подхватывается тот код, который предназначен для статуса заказа "Доставляется". Тоже интересно почему так?
А что может содержаться в поле delivery_service_id?
И какой у данного поля тип данных?
Вот такой вид поля delivery_service_id:
<property id="618" name="delivery_service_id" type="string">
<title>Идентификатор отслеживания</title>
<value>12291951MOW</value>
</property>
Я позаимствовал это условие из другой части сайта - из личного кабинета, где все прекрасно работает в том смысле, что если поле отсутствует, то ничего не выводится. Вот код от туда:
<xsl:if test="document(concat('uobject://',@id,'.delivery_service'))//value">
<tr>
<td>
<xsl:text>Отслеживание заказа:</xsl:text>
</td>
<td>
<xsl:apply-templates select="document(concat('uobject://',@id))/udata" mode="delivery_service" />
</td>
</tr>
</xsl:if>
Хотя здесь используется поле delivery_service для условия, смысл не меняется, т.к. они оба взаимосвязаны: без одного из них желаемый результат в дальнейшем не достижим. Изначально я и с ним пробовал, результат аналогичный - условие выполняется(((
Вид поля delivery_service:
<property id="617" name="delivery_service" type="relation">
<title>Сервис доставки</title>
<value>
<item id="36165" name="DPD" type-id="250" ownerId="2" xlink:href="uobject://36165"/>
</value>
</property>
Тип данных создавался новый - Справочник для поля "Сервис доставки"
К слову сказать, также писал чуть по-другому условие:
<xsl:template match="status_notification">
<xsl:variable name="order" select="document(concat('uobject://', order_id))/udata" />
<br />
<xsl:text>Ваш заказ № </xsl:text>
....
<xsl:when test="contains(status, 'доставляется')">
доставляется.
<xsl:if test="$order//property[@name = 'delivery_service_id']/value">
Отследить ход доставки Вы можете на сайте
<xsl:apply-templates select="document(concat('uobject://',order_id))/udata" mode="delivery_link" />
</xsl:if>
....
Результат точь-в-точь
Возможно, из-за того что у вас поле строка, value все равно выдается, даже несмотря на то что он пустой (в другом то примере тип поля "выпадающий список").
Попробуйте сделать такое условие
<xsl:variable name="delivery_service_id" select="document(concat('uobject://',order_id,'.delivery_service_id'))//value" />
<xsl:if test="$delivery_service_id and not($delivery_service_id='')">
считаем, что в поле delivery_service_id есть какое-то значение
</xsl:if >