在Xml中将某些属性转换为值

时间:2017-09-18 15:22:39

标签: c# xml xslt

我有以下xml

<CommPaid>
    <CommPaidData>
        <CommPaidData>
            <ChangeType>-1</ChangeType>
            <CoreMessageObjectArray>
                <HasMessage>False</HasMessage>
                <Message/>
                <MessageCode/>
                <Severity>0</Severity>
            </CoreMessageObjectArray>
            <ID>f4dc3b81-37f3-4789-a4a1-934bc39c6817</ID>
            <PremSource>EC</PremSource>
            <BatchControlNumber/>
            <PolRefNumb>Test_ram</PolRefNumb>
            <PremPaidDate>2015-12-11T00:00:00.0000000</PremPaidDate>
            <TotPremPayment>100000</TotPremPayment>
            <CommPrem>100000</CommPrem>
            <TransactionType id="00000000-0000-0000-0000-000000000001" code="1YRL">1ST YR LIFE</TransactionType>
            <PremiumType id="00000000-0000-0000-0000-000000000001" code="REG">Regular</PremiumType>
            <PremAmount>100000</PremAmount>
            <CommAgtLevel>Level 1</CommAgtLevel>
            <CommAgtValidation/>
            <WritingAgtCode>T127698</WritingAgtCode>
            <WritingAgtLevel>Level 1</WritingAgtLevel>
            <AgtMaxPct>0.05</AgtMaxPct>
            <AgtShare>1</AgtShare>
            <AgtMaxCommAvail>5000</AgtMaxCommAvail>
            <AgtNetPct>0.05</AgtNetPct>
            <AgtNetComm>5000</AgtNetComm>
            <AdjustType>Commission Earned</AdjustType>
            <CommPayStatus id="ffffffff-ffff-ffff-ffff-ffffffffffff" code="" />
            <EffectiveDate>2015-12-11T00:00:00.0000000</EffectiveDate>
            <LOB id="00000000-0000-0000-0000-000000000001" code="F">Flexible Premium Annuity</LOB>
            <TrxDescription/>
            <PlanCode>e6be3d0c-355a-4cbd-a38d-64aeab063c7f</PlanCode>
            <PlanDesc>e6be3d0c-355a-4cbd-a38d-64aeab063c7f</PlanDesc>
            <AgentNumber>T127698</AgentNumber>
            <CommStatementID>7a11aab1-2ec2-43c8-b131-af675c4c8149</CommStatementID>
            <PolicyYear>1</PolicyYear>
            <PremiumMode/>
            <IssueState>00000000-0000-0000-0000-000000000035</IssueState>
            <CommRateAdj>0</CommRateAdj>
            <EntityStatus id="0">False</EntityStatus>
            <DisplayFieldName/>
            <UserID>00000000-0000-0000-0000-000000000019</UserID>
            <TimeStamp>2015-12-11T11:06:17.8370000</TimeStamp>
        </CommPaidData>
    </CommPaidData>
</CommPaid>

xml中有某些节点具有属性“Code”。我想删除该属性并将其作为值添加到xml中,我还想从xml中删除所有其他属性

例如

<LOB id="00000000-0000-0000-0000-000000000001" code="F">Flexible Premium Annuity</LOB>

它应该

<LOB>F</LOB>

对于具有属性ID和代码的所有节点都应该这样做。

到目前为止,我已经创建了一个xslt,但它无法正常工作。 Xslt是: -

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

  <xsl:template match="@*">
    <xsl:element name="{name()}"><xsl:value-of select="."/></xsl:element>
  </xsl:template>
</xsl:stylesheet>

这会产生类似

的输出
<LOB>
    <id>00000000-0000-0000-0000-000000000001</id>
    <code>F</code>
    Flexible Premium Annuity
</LOB>

有人可以为我提供xslt的一些指导,我甚至愿意编写C#代码。

2 个答案:

答案 0 :(得分:1)

使用Xml Linq非常简单:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication5
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {

            XDocument doc = XDocument.Load(FILENAME);

            List<XElement> codes = doc.Descendants().Where(x => x.Attribute("code") != null).ToList();
            foreach (XElement code in codes)
            {
                code.ReplaceWith(new XElement(code.Name.LocalName, (string)code.Attribute("code")));
            }

        }
    }


}

答案 1 :(得分:0)

此样式表根据您的LOB示例提供您指定的输出:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">


<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="*[@code]">
    <xsl:element name="{name()}">
        <xsl:value-of select="@code"/>

    </xsl:element>
</xsl:template>
</xsl:stylesheet>

此样式表查找具有@code属性的任何元素,并在结果中将标记的属性值用作pcdata,并禁止之前存在的任何现有pcdata。匹配的标记中会抑制任何现有属性