对于具有两个父节点和多个子节点的XML结构?
问题描述:
我需要的XML进行结构是这样的:对于具有两个父节点和多个子节点的XML结构?
<Loans>
<Loan>
<GUID></GUID>
<LoanFolder></LoanFolder>
<LastModified></LastModified>
<TotalMonthlyPayment></TotalMonthlyPayment>
<AgentCompanyName></AgentCompanyName>
<LoanSecondaryStatusDates>
<LoanSecondaryStatus>
<StatusName>Name</StatusName>
<StatusDate>Date</StatusDate>
</LoanSecondaryStatus>
<LoanSecondaryStatus>
<StatusName>Name</StatusName>
<StatusDate>Date</StatusDate>
</LoanSecondaryStatus>
</LoanSecondaryStatusDates>
</Loan>
</Loans>
我有一个FOR XML查询的结构是这样的:
SELECT
[GUID]
,[LOANFOLDER]
,[LASTMODIFIED]
,[LASTIMPORTED]
,[TotalMonthlyPayment]
,[AgentCompanyName],
(
SELECT
'Borrower Docs Sent/Req' as 'StatusName',
CASE WHEN t.BorrowerDocsSent IS NOT NULL THEN t.BorrowerDocsSent ELSE '' END as 'StatusDate'
FROM Encompass_loanData as t
WHERE t.[GUID] = E.[GUID]
FOR XML PATH('LoanSecondaryStatus'), TYPE
),
(
SELECT
t.BorrowerCity as 'StatusName',
t.[GUID] as 'StatusDate'
FROM Encompass_loanData as t
WHERE t.[GUID] = E.[GUID]
FOR XML PATH('LoanSecondaryStatus'), TYPE
)
From Encompass_loanData E
WHERE [LASTMODIFIED] >= '20160121'
FOR XML PATH ('Loan'), type, root('Loans')
这让我接近,但缺少顶“ LoanSecondaryStatusDates“根节点。我如何添加这个根节点? http://sqlfiddle.com/#!6/d672a/2/0
注:我能使用这个XSL来添加节点:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Loan">
<xsl:copy>
<xsl:apply-templates select="@*|node()[not(self::LoanSecondaryStatus)]"/>
<LoanSecondaryStatusDates>
<xsl:apply-templates select="LoanSecondaryStatus"/>
</LoanSecondaryStatusDates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答
这是一个可能的SQL查询,根据您的SQL小提琴表结构建成,将生产所需的XML格式:
SELECT
[GUID]
,[LOANFOLDER]
,[LASTMODIFIED]
,[LASTIMPORTED]
,[TotalMonthlyPayment]
,[AgentCompanyName]
,(
SELECT * FROM
(
SELECT
CONVERT(VARCHAR(100), t.TotalMonthlyPayment) as 'StatusName',
t.[GUID] as 'StatusDate'
FROM [Sample] as t
WHERE t.[GUID] = E.[GUID]
UNION
SELECT
'Borrower Docs Sent/Req' as 'StatusName',
CASE WHEN t.LastModified IS NOT NULL THEN CONVERT(VARCHAR(25), t.LastModified, 126) ELSE '' END as 'StatusDate'
FROM [Sample] as t
WHERE t.[GUID] = E.[GUID]
) AS s
FOR XML PATH('LoanSecondaryStatus'), TYPE, root('LoanSecondaryStatusDates')
)
From [Sample] E
FOR XML PATH ('Loan'), type, root('Loans')
基本上,内FOR XML PATH
将返回LoanSecondaryStatus
元件包裹在一个LoanSecondaryStatusDates
母体,并用于产生LoanSecondaryStatus
数据UNION
子句。除此之外,上述查询中看到的所有转换都需要使UNION
的双方返回兼容数据类型,否则查询将终止并显示转换错误。
+0
不错。我认为工会产生LoanSecondaryStatus数据是缺失的元素。谢谢! – dc922
您能提供http://sqlfiddle.com/中的示例数据吗?仅供参考,[提出一个好的结构化查询语言(SQL)问题](http://meta.*.com/a/271056/2998271) – har07
在这里,你去 - 希望这有助于。 http://sqlfiddle.com/#!6/d672a/2/0 – dc922
嗯,我没有弄清楚如何用FOR XML做到这一点,但我能够应用XSL。 – dc922