2016-01-23 2 views
0

Я ищу способ добавить этот узел «LoanSecondaryStatusDates» в начале и соответствующий ему тег закрытия «LoanSecondaryStatusDates» до конца. Я подготовил ниже, используя «FOR XML» на SQL-сервере, но не могу понять, как добавить начальные и конечные теги. Если это возможно, используя «FOR XML», пример будет большим, иначе C# будет в порядке. Благодаря!Как добавить узел XML до и после набора узлов

Сейчас:

<Loans> 
    <Loan> 
     <GUID></GUID> 
     <AgentCompanyName></AgentCompanyName> 
     <LoanSecondaryStatus> 
      <StatusName>Name</StatusName> 
      <StatusDate>Date</StatusDate> 
     </LoanSecondaryStatus> 
     <LoanSecondaryStatus> 
      <StatusName>Name</StatusName> 
      <StatusDate>Date</StatusDate> 
     </LoanSecondaryStatus> 
    </Loan> 
</Loans> 

Конечный результат должен быть:

<Loans> 
    <Loan> 
    <GUID></GUID> 
    <AgentCompanyName></AgentCompanyName> 
    <LoanSecondaryStatusDates> 
     <LoanSecondaryStatus> 
      <StatusName>Name</StatusName> 
      <StatusDate>Date</StatusDate> 
    </LoanSecondaryStatus> 
     <LoanSecondaryStatus> 
      <StatusName>Name</StatusName> 
      <StatusDate>Date</StatusDate> 
     </LoanSecondaryStatus> 
    </LoanSecondaryStatusDates> 
</Loan> 
</Loans> 

FOR XML Query

SELECT 
    [GUID] 
    ,[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 
FOR XML PATH ('Loan'), type, root('Loans') 

SQL Fiddle: http://sqlfiddle.com/#!6/d672a/2/0

ответ

1

XML-вы опубликовали не действительный корень. Поэтому я добавил <xml> в качестве корня.

Это можно сделать довольно легко и на C#. Но это способ сделать это с помощью xpath.

<xml> 
    <LoanSecondaryStatus> 
    <StatusName>Name</StatusName> 
    <StatusDate>Date</StatusDate> 
    </LoanSecondaryStatus> 
    <LoanSecondaryStatus> 
    <StatusName>Name</StatusName> 
    <StatusDate>Date</StatusDate> 
    </LoanSecondaryStatus> 
    </xml> 

Это XSL.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
    <LoanSecondaryStatusDates>  
     <xsl:for-each select="xml/LoanSecondaryStatus"> 
     <LoanSecondaryStatus> 
      <StatusName> 
      <xsl:value-of select="StatusName"/> 
      </StatusName> 
      <StatusDate> 
      <xsl:value-of select="StatusDate"/> 
      </StatusDate> 
     </LoanSecondaryStatus> 
     </xsl:for-each>  
    </LoanSecondaryStatusDates> 
    </xsl:template> 
</xsl:stylesheet> 

Выход:

<?xml version="1.0" encoding="utf-8"?> 
<LoanSecondaryStatusDates> 
    <LoanSecondaryStatus> 
    <StatusName>Name</StatusName> 
    <StatusDate>Date</StatusDate> 
    </LoanSecondaryStatus> 
    <LoanSecondaryStatus> 
    <StatusName>Name</StatusName> 
    <StatusDate>Date</StatusDate> 
    </LoanSecondaryStatus> 
</LoanSecondaryStatusDates> 

Обновлен SQL запрос

SELECT 
    [GUID] 
    ,[AgentCompanyName], 
    (
    SELECT NULL, 
      (
       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 NULL AS X 
       FOR XML PATH('LoanSecondaryStatusDates'), 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 
      ), 
      NULL 
    FOR XML PATH('LoanSecondaryStatusDates'),TYPE 
    ) 
    FROM Encompass_loanData E 
    WHERE [LASTMODIFIED] >= '20160121' 
    FOR XML PATH ('Loan'), type, root('Loans') 
+0

Спасибо вам XSL работает, но удаляет другие элементы в документе XML. Есть ли способ сохранить существующую структуру такой же, но форматировать только этот раздел, как указано выше? – dc922

+0

Приношу свои извинения. Я добавил запрос FOR XML. – dc922

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> 
Смежные вопросы