XSL转换不接受xml
本文关键字:xml 不接受 转换 XSL | 更新日期: 2023-09-27 18:06:56
我正在尝试用XSL样式表转换XML字符串。但出于某种原因,他只取了根元素,而不取其他元素。有些东西摇摆不定,有时会出现问题,但我看不出问题。
我将在下面附上我的代码。
XSL<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns0="http://foo.com/foo" xmlns:ns1="http://foo.com/foo" exclude-result-prefixes="ns1">
<xsl:template match="/">
<ns0:ProductionOrderRequests>
<xsl:apply-templates select="ns1:ProductionOrderRequest" />
</ns0:ProductionOrderRequests>
</xsl:template>
<xsl:template match="ns1:ProductionOrderRequest">
<xsl:apply-templates select="ns1:ProductionOrderRequest" />
</xsl:template>
<xsl:template match="ns1:ProductionOrderRequest">
<ProductionOrderRequest>
<MESKey><xsl:value-of select="@MESKey" /></MESKey>
<Material><xsl:value-of select="@Material" /></Material>
<ProductionVersion><xsl:value-of select="@ProductionVersion" /></ProductionVersion>
<Resource><xsl:value-of select="@Resource" /></Resource>
<Plant><xsl:value-of select="@Plant" /></Plant>
<OrderType><xsl:value-of select="@OrderType" /></OrderType>
<StartDate><xsl:value-of select="@StartDate" /></StartDate>
<StartTime><xsl:value-of select="@StartTime" /></StartTime>
<EndDate></EndDate>
<EndTime></EndTime>
<TotalOrderQty><xsl:value-of select="@TotalOrderQty" /></TotalOrderQty>
</ProductionOrderRequest>
</xsl:template>
</xsl:stylesheet>
XML转换
<?xml version="1.0" encoding="utf-8"?>
<ProductionOrderRequests xmlns:ns0="http://foo.com/foo">
<ProductionOrderRequest>
<MESKey>TblDatProduction_4017</MESKey>
<Material>11596</Material>
<ProductionVersion>0001</ProductionVersion>
<Resource>60200001</Resource>
<Plant>BE01</Plant>
<OrderType>ZP76</OrderType>
<StartDate>24-10-2008</StartDate>
<StartTime>06:00:00</StartTime>
<EndDate></EndDate>
<EndTime></EndTime>
<TotalOrderQty>1.00</TotalOrderQty>
</ProductionOrderRequest>
</ProductionOrderRequests>
表示xml字符串的c#类
[XmlRoot("ProductionOrderRequests", Namespace = "http://foo.com/foo")]
public class ProductionOrderRequests
{
[XmlElement("ProductionOrderRequest")]
public List<ProductionOrderRequest> ProductionOrderRequestCollection { get; set; }
}
[XmlRoot("ProductionOrderRequest")]
public class ProductionOrderRequest
{
[XmlElement("MESKey")]
public string MESKey { get; set; }
[XmlElement("Material")]
public int Material { get; set; }
[XmlElement("ProductionVersion")]
public string ProductionVersion { get; set; }
[XmlElement("Resource")]
public int Resource { get; set; }
[XmlElement("Plant")]
public string Plant { get; set; }
[XmlElement("OrderType")]
public string OrderType { get; set; }
[XmlElement("StartDate")]
public string StartDate { get; set; }
[XmlElement("StartTime")]
public string StartTime { get; set; }
[XmlElement("EndDate")]
public string EndDate { get; set; }
[XmlElement("EndTime")]
public string EndTime { get; set; }
[XmlElement("TotalOrderQty")]
public string TotalOrderQty { get; set; }
}
预形成转换的函数
public static string Transform(this string xmlString, string xslpath)
{
string output = String.Empty;
try
{
StringReader rdr = new StringReader(xmlString);
XPathDocument myXPathDoc = new XPathDocument(rdr);
var myXslTrans = new XslCompiledTransform();
myXslTrans.Load(xslpath);
StringWriter sw = new StringWriter();
XmlWriter xwo = XmlWriter.Create(sw);
myXslTrans.Transform(myXPathDoc, null, xwo);
output = sw.ToString();
xwo.Close();
}
catch (Exception e)
{
Console.WriteLine("Exception: {0}", e.ToString());
}
return output;
}
What I've try
- 将c#类重命名为XSL值
- 将xsl值重命名为c#类
- 尝试使用XslTransform和XslCompiledTransform
您的XSLT有几个问题,但首先,您的XML也可能有问题。它是这样开始的…
<ProductionOrderRequests xmlns:ns0="http://foo.com/foo">
您已经声明了一个名称空间,但实际上并没有在任何地方使用前缀,这意味着ProductionOrderRequests和所有其他元素都不在名称空间中。当XSLT在名称空间中查找元素时,它不会匹配它们。您可能想在XML中这样做....
<ProductionOrderRequests xmlns="http://foo.com/foo">
(如果没有,则在XSLT中不需要相应的名称空间前缀)。
对于XSLT,您可以这样开始…
<xsl:template match="/">
<ns0:ProductionOrderRequests>
<xsl:apply-templates select="ns1:ProductionOrderRequest" />
</ns0:ProductionOrderRequests>
</xsl:template>
但是"/"
匹配文档节点,而不是根ProductionOrderRequests元素,因此在您做<xsl:apply-templates select="ns1:ProductionOrderRequest" />
的地方它不会找到任何东西,因为ProductionOrderRequests在这种情况下是子节点。它可能需要是这个....
<xsl:template match="/">
<ns0:ProductionOrderRequests>
<xsl:apply-templates select="ns1:ProductionOrderRequests" />
</ns0:ProductionOrderRequests>
</xsl:template>
然后你有这个模板…
<xsl:template match="ns1:ProductionOrderRequest">
<xsl:apply-templates select="ns1:ProductionOrderRequest" />
</xsl:template>
您正在匹配ProductionOrderRequest,但随后寻找同名的子节点。您可能打算这样做,以跳过父元素ProductionOrderRequests。
<xsl:template match="ns1:ProductionOrderRequests">
<xsl:apply-templates select="ns1:ProductionOrderRequest" />
</xsl:template>
最后,您输出的数据如下…
<MESKey><xsl:value-of select="@MESKey" /></MESKey>
但是'@'前缀用于属性。您的XML包含元素,所以它应该是…
<MESKey><xsl:value-of select="ns1:MESKey" /></MESKey>
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns0="http://foo.com/foo" xmlns:ns1="http://foo.com/foo" exclude-result-prefixes="ns1">
<xsl:template match="/">
<ns0:ProductionOrderRequests>
<xsl:apply-templates select="ns1:ProductionOrderRequests" />
</ns0:ProductionOrderRequests>
</xsl:template>
<xsl:template match="ns1:ProductionOrderRequests">
<xsl:apply-templates select="ns1:ProductionOrderRequest" />
</xsl:template>
<xsl:template match="ns1:ProductionOrderRequest">
<ProductionOrderRequest>
<MESKey><xsl:value-of select="ns1:MESKey" /></MESKey>
<Material><xsl:value-of select="ns1:Material" /></Material>
<ProductionVersion><xsl:value-of select="ns1:ProductionVersion" /></ProductionVersion>
<Resource><xsl:value-of select="ns1:Resource" /></Resource>
<Plant><xsl:value-of select="ns1:Plant" /></Plant>
<OrderType><xsl:value-of select="ns1:OrderType" /></OrderType>
<StartDate><xsl:value-of select="ns1:StartDate" /></StartDate>
<StartTime><xsl:value-of select="ns1:StartTime" /></StartTime>
<EndDate></EndDate>
<EndTime></EndTime>
<TotalOrderQty><xsl:value-of select="ns1:TotalOrderQty" /></TotalOrderQty>
</ProductionOrderRequest>
</xsl:template>
</xsl:stylesheet>