代码之家  ›  专栏  ›  技术社区  ›  Damovisa

请帮助我理解为什么我的XSL转换没有转换

  •  0
  • Damovisa  · 技术社区  · 16 年前

    我已经尝试了一段时间,但没有成功。我甚至没有任何例外。我将发布整个代码,希望有人能帮我找出我做错了什么。

    . 这种转变根本没有发生。


    <?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>
    

    以下是我的XSLT:

    <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>
    

    下面是我转换XML的方法:

    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;
    }
    

    strReturn的内容是一个XML标记( <?xml version="1.0" encoding="utf-8"?> )接着是原始XML文档内容的原始转储,去掉XML标记。

    我做错什么了?

    2 回复  |  直到 16 年前
        1
  •  4
  •   Dimitre Novatchev    16 年前

    我已经证实了 产生非常有意义的 (可能是想要的) 输出 .

    :可能提供的XML与实际使用的不一样?也许你有一个默认的命名空间?

    您可以很容易地验证您提供的xmlement是否位于命名空间中:inspect/print its NamespaceURI

        2
  •  1
  •   MaxGuernseyIII MaxGuernseyIII    16 年前

    我发现我需要将我的转换放置在以下模板中:

    <?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>
    

    其工作方式是,低优先级的catch all模板会捕获每个节点并复制其内容,同时在每个子节点上执行转换中的整个模板体。任何优先级超过-1000的模板都将优先。

    我真的不知道你是否能从中得到帮助,但是这个问题和我写它时试图解决的问题有着同样的味道。