У меня такая же проблема для управления настройками учетной записи, как и пары значений имени. Критерии проектирования - это то, что разные клиенты могут иметь разные наборы настроек.
Мое решение, подобно JWP, состоит в том, чтобы объединить стирание и замену, создавая запись слияния в вашем приложении.
Это довольно пуленепробиваемая, независимая от платформы и поскольку на клиента не более 20 настроек, это всего лишь 3 довольно низкого уровня загрузки db-вызовов - возможно, самый быстрый метод.
Альтернатива обновления отдельных строк - проверка исключений то вставка - или некоторая комбинация отвратительного кода, медленная и часто ломающаяся, потому что (как упоминалось выше) нестандартная обработка исключений SQL, изменяющаяся с db на db - или даже релиз для выпуска.
#This is pseudo-code - within the application:
BEGIN TRANSACTION - get transaction lock
SELECT all current name value pairs where id = $id into a hash record
create a merge record from the current and update record
(set intersection where shared keys in new win, and empty values in new are deleted).
DELETE all name value pairs where id = $id
COPY/INSERT merged records
END TRANSACTION
В XSLT 1.0 вы можете использовать технику, называемую методом Оливера Беккера , что означает написание use
в этой форме
concat(
substring(Str1,1 div Cond),
substring(Str2,1 div not(Cond))
)
Итак, в вашем случае вы могли бы напишите свой xsl:key
так:
<xsl:key name="item2" match="SHOPITEM" use="concat(
substring(substring-before(PRODUCT, ' SIZE.'), 1 div (contains(PRODUCT, ' SIZE.'))),
substring(PRODUCT, 1 div (not(contains(PRODUCT, ' SIZE.'))))
)" />
Считаете ли вы, что это читабельно, - другой вопрос.
Однако, в этом конкретном случае, для логики, которую вы пытаетесь реализовать, вы также можете написать ключ следующим образом:
<xsl:key name="item" match="SHOPITEM" use="substring-before(concat(PRODUCT, ' SIZE.'), ' SIZE.')" />
Итак, если PRODUCT
содержит SIZE.
, он будет найти текст до первого появления. Если нет, то будут объединенные SIZE.
, которые эффективно получат всю строку
См. Примеры в действии на http://xsltfiddle.liberty-development.net/jyRYYij