C# 请帮助我理解我的XSL转换没有转换的原因
我正在尝试使用XSL将一种XML格式转换为另一种XML格式。尽管我尽了最大努力,但似乎还是没有结果 我已经尝试了一段时间,但没有成功。我甚至没有任何例外。我将发布整个代码,希望有人能帮助我找出我做错了什么 我知道我使用的xsl在选择和匹配方面可能存在问题,但目前我并不担心这一点 我得到的输出是没有任何XML标记的输入XML。这种转变根本没有发生C# 请帮助我理解我的XSL转换没有转换的原因,c#,xml,xslt,C#,Xml,Xslt,我正在尝试使用XSL将一种XML格式转换为另一种XML格式。尽管我尽了最大努力,但似乎还是没有结果 我已经尝试了一段时间,但没有成功。我甚至没有任何例外。我将发布整个代码,希望有人能帮助我找出我做错了什么 我知道我使用的xsl在选择和匹配方面可能存在问题,但目前我并不担心这一点 我得到的输出是没有任何XML标记的输入XML。这种转变根本没有发生 这是我的XML文档: <?xml version="1.0"?> <Transactions> <Account
这是我的XML文档:
<?xml version="1.0"?>
<Transactions>
<Account>
<PersonalAccount>
<AccountNumber>066645621</AccountNumber>
<AccountName>A Smith</AccountName>
<CurrentBalance>-200125.96</CurrentBalance>
<AvailableBalance>0</AvailableBalance>
<AccountType>LOAN</AccountType>
</PersonalAccount>
</Account>
<StartDate>2010-03-01T00:00:00</StartDate>
<EndDate>2010-03-23T00:00:00</EndDate>
<Items>
<Transaction>
<ErrorNumber>-1</ErrorNumber>
<Amount>12000</Amount>
<Reference>Transaction 1</Reference>
<CreatedDate>0001-01-01T00:00:00</CreatedDate>
<EffectiveDate>2010-03-15T00:00:00</EffectiveDate>
<IsCredit>true</IsCredit>
<Balance>-324000</Balance>
</Transaction>
<Transaction>
<ErrorNumber>-1</ErrorNumber>
<Amount>11000</Amount>
<Reference>Transaction 2</Reference>
<CreatedDate>0001-01-01T00:00:00</CreatedDate>
<EffectiveDate>2010-03-14T00:00:00</EffectiveDate>
<IsCredit>true</IsCredit>
<Balance>-324000</Balance>
</Transaction>
</Items>
</Transactions>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" />
<xsl:param name="currentdate"></xsl:param>
<xsl:template match="Transactions">
<xsl:element name="OFX">
<xsl:element name="SIGNONMSGSRSV1">
<xsl:element name="SONRS">
<xsl:element name="STATUS">
<xsl:element name="CODE">0</xsl:element>
<xsl:element name="SEVERITY">INFO</xsl:element>
</xsl:element>
<xsl:element name="DTSERVER"><xsl:value-of select="$currentdate" /></xsl:element>
<xsl:element name="LANGUAGE">ENG</xsl:element>
</xsl:element>
</xsl:element>
<xsl:element name="BANKMSGSRSV1">
<xsl:element name="STMTTRNRS">
<xsl:element name="TRNUID">1</xsl:element>
<xsl:element name="STATUS">
<xsl:element name="CODE">0</xsl:element>
<xsl:element name="SEVERITY">INFO</xsl:element>
</xsl:element>
<xsl:element name="STMTRS">
<xsl:element name="CURDEF">AUD</xsl:element>
<xsl:element name="BANKACCTFROM">
<xsl:element name="BANKID">RAMS</xsl:element>
<xsl:element name="ACCTID"><xsl:value-of select="Account/PersonalAccount/AccountNumber" /></xsl:element>
<xsl:element name="ACCTTYPE"><xsl:value-of select="Account/PersonalAccount/AccountType" /></xsl:element>
</xsl:element>
<xsl:element name="BANKTRANLIST">
<xsl:element name="DTSTART"><xsl:value-of select="StartDate" /></xsl:element>
<xsl:element name="DTEND"><xsl:value-of select="EndDate" /></xsl:element>
<xsl:for-each select="Items/Transaction">
<xsl:element name="STMTTRN">
<xsl:element name="TRNTYPE"><xsl:choose><xsl:when test="IsCredit">CREDIT</xsl:when><xsl:otherwise>DEBIT</xsl:otherwise></xsl:choose></xsl:element>
<xsl:element name="DTPOSTED"><xsl:value-of select="EffectiveDate" /></xsl:element>
<xsl:element name="DTUSER"><xsl:value-of select="CreatedDate" /></xsl:element>
<xsl:element name="TRNAMT"><xsl:value-of select="Amount" /></xsl:element>
<xsl:element name="FITID" />
<xsl:element name="NAME"><xsl:value-of select="Reference" /></xsl:element>
<xsl:element name="MEMO"><xsl:value-of select="Reference" /></xsl:element>
</xsl:element>
</xsl:for-each>
</xsl:element>
<xsl:element name="LEDGERBAL">
<xsl:element name="BALAMT"><xsl:value-of select="Account/PersonalAccount/CurrentBalance" /></xsl:element>
<xsl:element name="DTASOF"><xsl:value-of select="EndDate" /></xsl:element>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
public string TransformToXml(XmlElement xmlElement, Dictionary<string, object> parameters)
{
string strReturn = "";
// Load the XSLT Document
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(xsltFileName);
// arguments
XsltArgumentList args = new XsltArgumentList();
if (parameters != null && parameters.Count > 0)
{
foreach (string key in parameters.Keys)
{
args.AddParam(key, "", parameters[key]);
}
}
//Create a memory stream to write to
Stream objStream = new MemoryStream();
// Apply the transform
xslt.Transform(xmlElement, args, objStream);
objStream.Seek(0, SeekOrigin.Begin);
// Read the contents of the stream
StreamReader objSR = new StreamReader(objStream);
strReturn = objSR.ReadToEnd();
return strReturn;
}
066645621
以史密斯
-200125.96
0
贷款
2010-03-01T00:00:00
2010-03-23T00:00:00
-1
12000
交易1
0001-01-01T00:00:00
2010-03-15T00:00:00
真的
-324000
-1
11000
交易2
0001-01-01T00:00:00
2010-03-14T00:00:00
真的
-324000
这是我的XSLT:
<?xml version="1.0"?>
<Transactions>
<Account>
<PersonalAccount>
<AccountNumber>066645621</AccountNumber>
<AccountName>A Smith</AccountName>
<CurrentBalance>-200125.96</CurrentBalance>
<AvailableBalance>0</AvailableBalance>
<AccountType>LOAN</AccountType>
</PersonalAccount>
</Account>
<StartDate>2010-03-01T00:00:00</StartDate>
<EndDate>2010-03-23T00:00:00</EndDate>
<Items>
<Transaction>
<ErrorNumber>-1</ErrorNumber>
<Amount>12000</Amount>
<Reference>Transaction 1</Reference>
<CreatedDate>0001-01-01T00:00:00</CreatedDate>
<EffectiveDate>2010-03-15T00:00:00</EffectiveDate>
<IsCredit>true</IsCredit>
<Balance>-324000</Balance>
</Transaction>
<Transaction>
<ErrorNumber>-1</ErrorNumber>
<Amount>11000</Amount>
<Reference>Transaction 2</Reference>
<CreatedDate>0001-01-01T00:00:00</CreatedDate>
<EffectiveDate>2010-03-14T00:00:00</EffectiveDate>
<IsCredit>true</IsCredit>
<Balance>-324000</Balance>
</Transaction>
</Items>
</Transactions>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" />
<xsl:param name="currentdate"></xsl:param>
<xsl:template match="Transactions">
<xsl:element name="OFX">
<xsl:element name="SIGNONMSGSRSV1">
<xsl:element name="SONRS">
<xsl:element name="STATUS">
<xsl:element name="CODE">0</xsl:element>
<xsl:element name="SEVERITY">INFO</xsl:element>
</xsl:element>
<xsl:element name="DTSERVER"><xsl:value-of select="$currentdate" /></xsl:element>
<xsl:element name="LANGUAGE">ENG</xsl:element>
</xsl:element>
</xsl:element>
<xsl:element name="BANKMSGSRSV1">
<xsl:element name="STMTTRNRS">
<xsl:element name="TRNUID">1</xsl:element>
<xsl:element name="STATUS">
<xsl:element name="CODE">0</xsl:element>
<xsl:element name="SEVERITY">INFO</xsl:element>
</xsl:element>
<xsl:element name="STMTRS">
<xsl:element name="CURDEF">AUD</xsl:element>
<xsl:element name="BANKACCTFROM">
<xsl:element name="BANKID">RAMS</xsl:element>
<xsl:element name="ACCTID"><xsl:value-of select="Account/PersonalAccount/AccountNumber" /></xsl:element>
<xsl:element name="ACCTTYPE"><xsl:value-of select="Account/PersonalAccount/AccountType" /></xsl:element>
</xsl:element>
<xsl:element name="BANKTRANLIST">
<xsl:element name="DTSTART"><xsl:value-of select="StartDate" /></xsl:element>
<xsl:element name="DTEND"><xsl:value-of select="EndDate" /></xsl:element>
<xsl:for-each select="Items/Transaction">
<xsl:element name="STMTTRN">
<xsl:element name="TRNTYPE"><xsl:choose><xsl:when test="IsCredit">CREDIT</xsl:when><xsl:otherwise>DEBIT</xsl:otherwise></xsl:choose></xsl:element>
<xsl:element name="DTPOSTED"><xsl:value-of select="EffectiveDate" /></xsl:element>
<xsl:element name="DTUSER"><xsl:value-of select="CreatedDate" /></xsl:element>
<xsl:element name="TRNAMT"><xsl:value-of select="Amount" /></xsl:element>
<xsl:element name="FITID" />
<xsl:element name="NAME"><xsl:value-of select="Reference" /></xsl:element>
<xsl:element name="MEMO"><xsl:value-of select="Reference" /></xsl:element>
</xsl:element>
</xsl:for-each>
</xsl:element>
<xsl:element name="LEDGERBAL">
<xsl:element name="BALAMT"><xsl:value-of select="Account/PersonalAccount/CurrentBalance" /></xsl:element>
<xsl:element name="DTASOF"><xsl:value-of select="EndDate" /></xsl:element>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
public string TransformToXml(XmlElement xmlElement, Dictionary<string, object> parameters)
{
string strReturn = "";
// Load the XSLT Document
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(xsltFileName);
// arguments
XsltArgumentList args = new XsltArgumentList();
if (parameters != null && parameters.Count > 0)
{
foreach (string key in parameters.Keys)
{
args.AddParam(key, "", parameters[key]);
}
}
//Create a memory stream to write to
Stream objStream = new MemoryStream();
// Apply the transform
xslt.Transform(xmlElement, args, objStream);
objStream.Seek(0, SeekOrigin.Begin);
// Read the contents of the stream
StreamReader objSR = new StreamReader(objStream);
strReturn = objSR.ReadToEnd();
return strReturn;
}
0
信息
英格
1.
0
信息
澳元
公羊
贷记借方
下面是我转换XML的方法:
<?xml version="1.0"?>
<Transactions>
<Account>
<PersonalAccount>
<AccountNumber>066645621</AccountNumber>
<AccountName>A Smith</AccountName>
<CurrentBalance>-200125.96</CurrentBalance>
<AvailableBalance>0</AvailableBalance>
<AccountType>LOAN</AccountType>
</PersonalAccount>
</Account>
<StartDate>2010-03-01T00:00:00</StartDate>
<EndDate>2010-03-23T00:00:00</EndDate>
<Items>
<Transaction>
<ErrorNumber>-1</ErrorNumber>
<Amount>12000</Amount>
<Reference>Transaction 1</Reference>
<CreatedDate>0001-01-01T00:00:00</CreatedDate>
<EffectiveDate>2010-03-15T00:00:00</EffectiveDate>
<IsCredit>true</IsCredit>
<Balance>-324000</Balance>
</Transaction>
<Transaction>
<ErrorNumber>-1</ErrorNumber>
<Amount>11000</Amount>
<Reference>Transaction 2</Reference>
<CreatedDate>0001-01-01T00:00:00</CreatedDate>
<EffectiveDate>2010-03-14T00:00:00</EffectiveDate>
<IsCredit>true</IsCredit>
<Balance>-324000</Balance>
</Transaction>
</Items>
</Transactions>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" />
<xsl:param name="currentdate"></xsl:param>
<xsl:template match="Transactions">
<xsl:element name="OFX">
<xsl:element name="SIGNONMSGSRSV1">
<xsl:element name="SONRS">
<xsl:element name="STATUS">
<xsl:element name="CODE">0</xsl:element>
<xsl:element name="SEVERITY">INFO</xsl:element>
</xsl:element>
<xsl:element name="DTSERVER"><xsl:value-of select="$currentdate" /></xsl:element>
<xsl:element name="LANGUAGE">ENG</xsl:element>
</xsl:element>
</xsl:element>
<xsl:element name="BANKMSGSRSV1">
<xsl:element name="STMTTRNRS">
<xsl:element name="TRNUID">1</xsl:element>
<xsl:element name="STATUS">
<xsl:element name="CODE">0</xsl:element>
<xsl:element name="SEVERITY">INFO</xsl:element>
</xsl:element>
<xsl:element name="STMTRS">
<xsl:element name="CURDEF">AUD</xsl:element>
<xsl:element name="BANKACCTFROM">
<xsl:element name="BANKID">RAMS</xsl:element>
<xsl:element name="ACCTID"><xsl:value-of select="Account/PersonalAccount/AccountNumber" /></xsl:element>
<xsl:element name="ACCTTYPE"><xsl:value-of select="Account/PersonalAccount/AccountType" /></xsl:element>
</xsl:element>
<xsl:element name="BANKTRANLIST">
<xsl:element name="DTSTART"><xsl:value-of select="StartDate" /></xsl:element>
<xsl:element name="DTEND"><xsl:value-of select="EndDate" /></xsl:element>
<xsl:for-each select="Items/Transaction">
<xsl:element name="STMTTRN">
<xsl:element name="TRNTYPE"><xsl:choose><xsl:when test="IsCredit">CREDIT</xsl:when><xsl:otherwise>DEBIT</xsl:otherwise></xsl:choose></xsl:element>
<xsl:element name="DTPOSTED"><xsl:value-of select="EffectiveDate" /></xsl:element>
<xsl:element name="DTUSER"><xsl:value-of select="CreatedDate" /></xsl:element>
<xsl:element name="TRNAMT"><xsl:value-of select="Amount" /></xsl:element>
<xsl:element name="FITID" />
<xsl:element name="NAME"><xsl:value-of select="Reference" /></xsl:element>
<xsl:element name="MEMO"><xsl:value-of select="Reference" /></xsl:element>
</xsl:element>
</xsl:for-each>
</xsl:element>
<xsl:element name="LEDGERBAL">
<xsl:element name="BALAMT"><xsl:value-of select="Account/PersonalAccount/CurrentBalance" /></xsl:element>
<xsl:element name="DTASOF"><xsl:value-of select="EndDate" /></xsl:element>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
public string TransformToXml(XmlElement xmlElement, Dictionary<string, object> parameters)
{
string strReturn = "";
// Load the XSLT Document
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(xsltFileName);
// arguments
XsltArgumentList args = new XsltArgumentList();
if (parameters != null && parameters.Count > 0)
{
foreach (string key in parameters.Keys)
{
args.AddParam(key, "", parameters[key]);
}
}
//Create a memory stream to write to
Stream objStream = new MemoryStream();
// Apply the transform
xslt.Transform(xmlElement, args, objStream);
objStream.Seek(0, SeekOrigin.Begin);
// Read the contents of the stream
StreamReader objSR = new StreamReader(objStream);
strReturn = objSR.ReadToEnd();
return strReturn;
}
公共字符串TransformToXml(XmlElement、字典参数)
{
字符串strReturn=“”;
//加载XSLT文档
XslCompiledTransform xslt=新的XslCompiledTransform();
Load(xsltFileName);
//论据
XsltArgumentList args=new XsltArgumentList();
if(parameters!=null&¶meters.Count>0)
{
foreach(parameters.Keys中的字符串键)
{
args.AddParam(键“”,参数[key]);
}
}
//创建要写入的内存流
Stream objStream=新内存流();
//应用变换
Transform(xmlement、args、objStream);
Seek(0,SeekOrigin.Begin);
//阅读流的内容
StreamReader objSR=新的StreamReader(objStream);
strReturn=objSR.ReadToEnd();
返回strReturn;
}
strReturn的内容是一个XML标记(
),后面是原始XML文档内容的原始转储,去掉了XML标记
我做错了什么?我发现我需要将我的转换放置在以下模板中:
<?xml version="1.0" encoding="UTF-8" ?>
<xslt:stylesheet version="1.0"
xmlns:xslt="http://www.w3.org/1999/XSL/Transform">
<xslt:template match="child::*"
priority="-1000">
<xslt:copy>
<xslt:call-template name="dc_CopyAll" />
</xslt:copy>
</xslt:template>
<xslt:template match="attribute::*"
priority="-1000">
<xslt:attribute namespace="{namespace-uri()}"
name="{local-name()}">
<xslt:value-of select="." />
</xslt:attribute>
</xslt:template>
<xslt:template name="dc_CopyAll">
<xslt:apply-templates select="attribute::*|child::*" />
</xslt:template>
<!-- your transforms would go here -->
</xslt:stylesheet>
其工作方式是,存在低优先级的“捕获所有”模板,这些模板捕获每个节点并复制其内容,同时在每个子节点上执行转换中的整个模板体。任何优先级高于-1000的模板都将优先
老实说,我不知道你是否能从中得到帮助,但这个问题与我编写它时试图解决的问题有着相同的味道。我发现我需要将我的转换放置在以下模板中:
<?xml version="1.0" encoding="UTF-8" ?>
<xslt:stylesheet version="1.0"
xmlns:xslt="http://www.w3.org/1999/XSL/Transform">
<xslt:template match="child::*"
priority="-1000">
<xslt:copy>
<xslt:call-template name="dc_CopyAll" />
</xslt:copy>
</xslt:template>
<xslt:template match="attribute::*"
priority="-1000">
<xslt:attribute namespace="{namespace-uri()}"
name="{local-name()}">
<xslt:value-of select="." />
</xslt:attribute>
</xslt:template>
<xslt:template name="dc_CopyAll">
<xslt:apply-templates select="attribute::*|child::*" />
</xslt:template>
<!-- your transforms would go here -->
</xslt:stylesheet>
其工作方式是,存在低优先级的“捕获所有”模板,这些模板捕获每个节点并复制其内容,同时在每个子节点上执行转换中的整个模板体。任何优先级高于-1000的模板都将优先
老实说,我不知道您是否会因此得到帮助,但这个问题与我编写它时试图解决的问题有着相同的味道。我已经验证了,在所提供的XML文档上应用XslCompiledTransform时,所提供的转换产生了非常有意义的(可能是所需的)输出 让我猜一下:可能提供的XML与实际使用的XML不同?可能您有默认名称空间 如果是这样,您需要匹配默认名称空间中的节点,而不是“无名称空间”中的节点
您可以很容易地验证您提供的XmlElement是否位于命名空间中:检查/打印其
NamespaceURI
属性。我已经验证了在提供的XML文档上应用XslCompiledTransform时提供的转换是否产生了非常有意义的(可能是所需的转换)输出
让我猜一下:可能提供的XML与实际使用的XML不同?可能您有默认名称空间
如果是这样,您需要匹配默认名称空间中的节点,而不是“无名称空间”中的节点
您可以很容易地验证您提供的XmlElement是否位于命名空间中:检查/打印其
NamespaceURI
属性。您希望它看起来像什么?XmlElement是什么?您是在尝试转换XML文档还是仅转换文档的一个元素?在Visual Studio中对整个已发布的XmlDocument运行XSLT时,转换成功了。它应该是XML,从根节点
开始。如果您愿意,我可以粘贴一个粗略的预期输出,但目前它似乎根本没有转换。@Jacob-我正在尝试转换