Я думаю, что будет простой способ сделать это, но вот один из вариантов:
DECLARE @DataXML XML;
SET @DataXML = '<Student version="2">
<Section name="Report">
<Glossary>
<Item name="Some text"></Item>
</Glossary>
<InputNumber type="int" min="0" max="100" title="Maths" format="normal" description="Marks out of 100">
<Value>70</Value>
</InputNumber>
<InputNumber type="int" min="0" max="100" title="Science" format="normal" description="Marks out of 100">
<Value>60</Value>
</InputNumber>
<InputNumber type="int" min="0" max="100" title="English" format="normal" description="Marks out of 100">
<Value>80</Value>
</InputNumber>
<InputNumber type="float" min="100" max="100" title="Total " format="normal" description="Total of all subjects marks added together.">
<Value />
</InputNumber>
<InputNumber type="int" min="0" max="10000" title="How many students in the class?" format="normal" description="total students">
<Value>19</Value>
</InputNumber>
<InputNumber type="int" min="0" max="100" title="How many subjects are there?" format="normal" description="total subjects">
<Value>3</Value>
</InputNumber>
</Section>
</Student>';
SET @DataXML.modify('insert text{sum(./Student[@version="2"]/Section[@name="Report"]/InputNumber[@description="Marks out of 100"]/Value)} into (./Student[@version="2"]/Section[@name="Report"]/InputNumber[@description="Total of all subjects marks added together."]/Value)[1]');
SELECT @DataXML;
Идея состоит в том, чтобы вставить text
для этого узла:
(./Student[@version="2"]/Section[@name="Report"]/InputNumber[@description="Total of all subjects marks added together."]/Value)[1]
и текст простой, вот некоторые из них:
sum(./Student[@version="2"]/Section[@name="Report"]/InputNumber[@description="Marks out of 100"]/Value)
Я не люблю выбирать узлы, используя значение тега description. Было бы лучше, если бы у вас был другой путь.
Кроме того, было бы лучше, если бы эти данные были нормализованы в таблицах SQL и построили это XML
с помощью предложения FOR XML
перед его отправкой в приложение.
Вы можете отфильтровать узлы для некоторых, как это:
SET @DataXML.modify('insert text{sum(./Student[@version="2"]/Section[@name="Report"]/InputNumber[@title="Maths" or @title="Science" or @title="English"]/Value)} into (./Student[@version="2"]/Section[@name="Report"]/InputNumber[@description="Total of all subjects marks added together."]/Value)[1]');
, используя заголовки:
(./Student[@version="2"]/Section[@name="Report"]/InputNumber[@title="Maths" or @title="Science" or @title="English"]/Value)
Будет лучше добавить тип input
и фильтр по нему - например, добавить атрибут type=mark
.