Hi @tom pratt,
Please try the following solution.
-- DDL and sample data population, start
DECLARE @tbl TABLE (
ProductID nvarchar(25) NULL,
[Name] nvarchar(25) NULL,
ParentID nvarchar(51) NULL,
AttributeType nvarchar(10) NULL,
AttributeID nvarchar(255) NULL,
UnitID nvarchar(255) NULL,
AttributeValue nvarchar(4000) NULL
);
INSERT INTO @tbl (ProductID, [Name], ParentID, AttributeType, AttributeID, UnitID, AttributeValue)
VALUES
('1160577','TCF40','39121606_4903','Value','Connection',NULL,'Blade end'),
('1160577','TCF40','39121606_4903','Value','Mounting',NULL,'35 mm DIN Rail, Chassis'),
('1160577','TCF40','39121606_4903','Value','Amperage Rating','unit.Elec.Amperes','40'),
('1160577','TCF40','39121606_4903','MultiValue','Class',NULL,'Class CF');
-- DDL and sample data population, end
SELECT * FROM @tbl
--FOR XML PATH('r'), TYPE, ROOT('root');
SELECT 'Context1' AS [@ImportContext]
, 'Context1' AS [@ContextID]
, 'Main' AS [@WorkspaceID]
, 'false' AS [@UseContextLocale]
, (
SELECT ProductID AS [@ID]
, 'CatalogNumber' AS [@UserTypeID]
, ParentID AS [@ParentID]
, Name AS [Name]
, (SELECT AttributeType, AttributeID, UnitID, AttributeValue
FROM @tbl AS c
WHERE p.ProductID = c.ProductID
AND p.ParentID = c.ParentID
AND p.[Name] = c.[Name]
FOR XML PATH('r'), TYPE, ROOT('root')
).query('<Values>
{
for $x in /root/r[AttributeType="Value"]
return <Value AttributeID="{data($x/AttributeID)}">
{if ($x/UnitID) then attribute UnitID {$x/UnitID} else ()}
{data($x/AttributeValue)}
</Value>,
<MultiValue AttributeID="{(/root/r[AttributeType="MultiValue"]/AttributeID/text())[1]}">
{ if (/root/r[AttributeType="MultiValue"]/UnitID)
then attribute UnitID {/root/r[AttributeType="MultiValue"]/UnitID}
else () }
{
for $x in /root/r[AttributeType="MultiValue"]/AttributeValue/text()
return <Value>{$x}</Value>
}
</MultiValue>
}
</Values>')
FROM @tbl AS p
GROUP BY ProductID, ParentID, [Name]
FOR XML PATH('Product'), TYPE, ROOT('Products')
)
FOR XML PATH('STEP-ProductInformation'), TYPE;