Вы неправильно используете символ /
. Попробуйте это так:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:iws="http://vsystems.com/WS/StockAdjustments"
exclude-result-prefixes="iws">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="k1" match="iws:StockAdjustment" use="concat(@Article, '|', @Status)"/>
<xsl:template match="/iws:StockAdjustments">
<xsl:copy>
<xsl:for-each select="iws:StockAdjustment[generate-id()=generate-id(key('k1', concat(@Article,'|',@Status))[1])]">
<xsl:copy>
<xsl:copy-of select="@Article"/>
<QTY_EXPE>
<xsl:value-of select="sum(key('k1', concat(@Article,'|',@Status))/@Quantity)" />
</QTY_EXPE>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Результат не тот, который вы опубликовали, но я пошел с вашей попыткой. В любом случае суммы верны.
Стандартным способом ANSI для создания идентификатора с разделителями является:
SELECT "field1" ...
и, если в имени есть «, удвойте его:
SELECT "some""thing" ...
К сожалению, это не работает в MySQL с настройками по умолчанию, потому что MySQL предпочитает думать, что двойные кавычки являются альтернативой одинарным кавычкам для строковых литералов. В этом случае вы должны использовать обратные кавычки (как обрисовано в общих чертах Бьёрном) и экранирование обратной косой черты.
Кому для правильного экранирования обратной косой черты вам понадобится mysql_real_escape_string, поскольку она зависит от набора символов. Но дело в споре, потому что ни mysql_real_escape_string, ни добавочные косые черты не экранируют символ обратной цитаты . Если вы можете убедитесь, что в именах столбцов никогда не будет символов, отличных от ASCII, которые вы можете получить, просто убрав обратную косую черту и символы `и \.
В любом случае, это несовместимо с другими базами данных. MySQL, чтобы разрешить синтаксис ANSI, установив параметр конфигурации ANSI_QUOTES. Аналогично, SQL Server также подавляется двойные кавычки по умолчанию; он использует еще один синтаксис, а именно квадратные скобки. Опять же, вы можете настроить его для поддержки синтаксиса ANSI с параметром «quoted_identifier».
Резюме: если вам нужна только совместимость с MySQL:
a. используйте обратные кавычки и запрещайте в именах символы обратных кавычек, обратной косой черты и nul, потому что экранирование их ненадежно
Если вам нужна совместимость с несколькими СУБД, либо:
b. используйте двойные кавычки и требуйте от пользователей MySQL / SQL-сервера соответствующего изменения конфигурации. Запрещать символы двойных кавычек в имени (так как Oracle не может их обработать даже без экранирования). Или
c. иметь настройку для MySQL против SQL Server против других, и в зависимости от этого вывести синтаксис обратной кавычки, квадратной скобки или двойной кавычки. Запретить как двойные кавычки, так и обратную косую черту / обратную цитату / нуль.
Это то, на что вы надеетесь, что уровень доступа к данным будет иметь функцию, но PDO нет.
Резюме резюме: произвольные имена столбцов - это проблема, которую лучше избегать, если вы можете ей помочь.
Краткое содержание резюме: gnnnnnnnnnnnh.
Необычный дизайн проекта, но для вашей проблемы: окружите имена полей символом `и используйте дополнительные косые черты для имени.
select `field1`, `field2` from table where `field3`=:value