Возможный способ использования srcset и размеров в высокодинамичном макете

Проблема здесь усугубляется тем фактом, что вы не можете напрямую объявлять пространства имен вручную при использовании XML PATH. SQL Server откажется от любых имен атрибутов, начинающихся с «xmlns» и любых имен тегов с двоеточиями в них.

Вместо того, чтобы прибегать к использованию относительно недружественного XML EXPLICIT, я столкнулся с проблемой, сначала создав XML с определениями и ссылками пространства имен 'cloaked', затем строка заменяется следующим образом ...

DECLARE @Order TABLE (
  OrderID INT, 
  OrderDate DATETIME)

DECLARE @OrderDetail TABLE (
  OrderID INT, 
  ItemID VARCHAR(1), 
  ItemName VARCHAR(50), 
  Qty INT)

INSERT @Order 
VALUES 
(1, '2010-01-01'),
(2, '2010-01-02')

INSERT @OrderDetail 
VALUES 
(1, 'A', 'Drink',  5),
(1, 'B', 'Cup',    2),
(2, 'A', 'Drink',  2),
(2, 'C', 'Straw',  1),
(2, 'D', 'Napkin', 1)

declare @xml xml

set @xml = (SELECT
  'http://test.com/order' as "@xxmlns..od",  -- 'Cloaked' namespace def
  (SELECT OrderID AS "@OrderID", 
    (SELECT 
      ItemID AS "@od..ItemID", 
      ItemName AS "data()" 
     FROM @OrderDetail 
     WHERE OrderID = o.OrderID 
     FOR XML PATH ('od..Item'), TYPE)
   FROM @Order o
   FOR XML PATH ('od..Order'), TYPE)
  FOR XML PATH('xml'))

set @xml = cast(replace(replace(cast(@xml as nvarchar(max)), 'xxmlns', 'xmlns'),'..',':') as xml)

select @xml

Несколько вещей, которые следует указать:

  1. Я использую ' xxmlns 'в качестве моей скрытой версии «xmlns» и «..», чтобы встать на «:». Это может не сработать для вас, если у вас есть «..» как часть текстовых значений - вы можете заменить это на что-то еще, пока вы выбираете что-то, что делает допустимым XML-идентификатор.
  2. Поскольку нам нужно определение xmlns на верхнем уровне, мы не сможем использовать параметр ROOT для XML PATH - вместо этого мне нужно было добавить другой внешний уровень в структуру подзаголовка для достижения этого.
0
задан neo post modern 16 January 2019 в 15:47
поделиться