我有问题。我有一个SQL Server表,它在一列中存储了一堆XML文档。我需要将这些XML文档传递给XML解析器,但我的起始XML的格式不是解析器可以接受的格式。这是我必须要做的事情 -
存储在我的SQL Server表中的XML采用以下格式:
<Document ID="207">
<Version>1.0</Version>
<LastModifiedInVersion>1.0</LastModifiedInVersion>
<Signatures />
<Controls>
<Control ID="EmpID">
<Value>45678</Value>
</Control>
<Control ID="EmpFN">
<Value>Ryn</Value>
</Control>
<Control ID="EmpLN">
<Value>Veris</Value>
</Control>
<Control ID="EmpDOB">
<Value>01/19/1980</Value>
</Control>
</Controls>
<AutoKeys />
</Document>
我需要使用XML并使其看起来像这样:
<xml_record>
<employee>
<EmpID value="45678"/>
<EmpFN value="Ryn"/>
<EmpLN value="Veris"/>
<empDOB value="01/19/1980"/>
</employee>
</xml_record>
我研究过使用XSLT,但它似乎都是基于在浏览器中显示XML数据而不是实际格式的翻译。我的最终目标是简单地翻译格式并使用XML解析器拉取员工值以填充另一个表,我不需要任何原始XML的其余部分。我想要做甚么可能吗?如果是这样,只要指出我正确的方向就会很棒。
答案 0 :(得分:1)
试试这个:
DECLARE @xdoc xml = '<Document ID="207">
<Version>1.0</Version>
<LastModifiedInVersion>1.0</LastModifiedInVersion>
<Signatures />
<Controls>
<Control ID="EmpID">
<Value>45678</Value>
</Control>
<Control ID="EmpFN">
<Value>Ryn</Value>
</Control>
<Control ID="EmpLN">
<Value>Veris</Value>
</Control>
<Control ID="EmpDOB">
<Value>01/19/1980</Value>
</Control>
</Controls>
<AutoKeys />
</Document>
'
SELECT
EmpID 'EmpID/@value',
EmpFN 'EmpFN/@value',
EmpLN 'EmpLN/@value',
EmpDOB 'EmpDOB/@value'
FROM (
SELECT
@xdoc.query('//Control[@ID = "EmpID"]/Value').value('.','INT') AS EmpID,
@xdoc.query('//Control[@ID = "EmpFN"]/Value').value('.','VARCHAR(100)') AS EmpFN,
@xdoc.query('//Control[@ID = "EmpLN"]/Value').value('.','VARCHAR(100)') AS EmpLN,
@xdoc.query('//Control[@ID = "EmpDOB"]/Value').value('.','VARCHAR(100)') AS EmpDOB
)t
FOR XML PATH('employee'), ROOT('xml_record')
不是最优雅,但有效。