【问题标题】:XSL Transformation not taking xmlXSL 转换不采用 xml
【发布时间】:2014-06-06 07:46:12
【问题描述】:

我正在尝试使用 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;
    }

我尝试过的

  • 将 c# 类重命名为 XSL 值
  • 将 xsl 值重命名为 C# 类
  • 尝试使用 XslTransform 和 XslCompiledTransform

【问题讨论】:

  • 您的 XML 文件似乎格式不正确。就在这里吗?您是否尝试过使用 VS 和您的输入 XML 来调试 XSL?
  • 好吧,我在给定类中序列化来自 DB 的数据,并提供上述 xml。以及你的意思是没有形成良好的?
  • &lt;ProductionOrderRequests&gt;&lt;ProductionOrderRequest&gt; 元素未关闭。
  • 它们是,但格式不好,所以它们不可见。我修好了。
  • 是的,当我发布问题时,xml 格式有时会变坏

标签: c# xml xslt


【解决方案1】:

您的 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 元素,因此您在 &lt;xsl:apply-templates select="ns1:ProductionOrderRequest" /&gt; 执行的位置不会找到任何内容,因为 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>

【讨论】:

猜你喜欢
  • 2016-02-12
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
相关资源
最近更新 更多