Пожалуйста, помогите мне понять, почему мой XSL Transform не трансформируется - PullRequest
0 голосов
/ 24 марта 2010

Я пытаюсь преобразовать один формат XML в другой, используя XSL. Попробуйте, как я мог, я не могу получить результат.

Я уже давно этим занимался, и у меня не было успеха. Я даже не получаю никаких исключений. Я собираюсь опубликовать весь код, и, надеюсь, кто-то может помочь мне разобраться, что я сделал неправильно.

Я знаю, что в xsl у меня могут быть проблемы с выбором и совпадением, но в данный момент я не беспокоюсь об этом.

Вывод, который я получаю - это ввод XML без каких-либо тегов XML . Преобразование просто не происходит.


Вот мой 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>

Вот мой 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 ]

4 голосов
/ 24 марта 2010

Я убедился, что предоставленное преобразование при применении с XslCompiledTransform к предоставленному XML-документу дает очень значимое (вероятно, желаемое) вывод .

Позвольте мне угадать : может быть, предоставленный XML не совпадает с используемым на практике? Может быть, у вас есть пространство имен по умолчанию?

Если это так, вам нужно сопоставить узлы в пространстве имен по умолчанию, а не в «no namespace».

Вы можете легко проверить, находится ли предоставленный вами элемент XmlElement в пространстве имен: проверить / напечатать его свойство NamespaceURI.

1 голос
/ 24 марта 2010

Я обнаружил, что мне нужно разместить свои преобразования в следующем шаблоне:

<?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 будет иметь приоритет.

Честно говоря, я не знаю, поможет ли вам это, но проблема имеет тот же запах, что и проблема, которую я пытался решить, когда писал ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...