我有以下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#代码。
答案 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。匹配的标记中会抑制任何现有属性