2013-05-17 2 views
0

Этот XML генерирует из Dynamics Ax, которые необходимо преобразование (XSLT): нужно создать XSLT для того, чтобы получить предназначенный исходящую XML файлDynamics Ax исходящую XML преобразование

<?xml version="1.0" encoding="UTF-16"?> 
<Envelope xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message"> 
    <Header> 
    <MessageId>{3BCFB0D6-EAB4-430E-9921-E365F189046D}</MessageId> 
    <Action>http://schemas.microsoft.com/dynamics/2008/01/services/LedgerExchangeRateService/read</Action> 
    </Header> 
    <Body> 
    <MessageParts xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message"> 
     <LedgerExchangeRate xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/LedgerExchangeRate"> 
     <SenderId>Womar</SenderId> 
     <CurrencyPair class="entity"> 
      <FromCurrencyCode>US</FromCurrencyCode> 
      <ToCurrencyCode>DKK</ToCurrencyCode> 
      <ExchangeRateType>Default</ExchangeRateType> 
      <ExchangeRateDisplayFactor>Hundred</ExchangeRateDisplayFactor> 
      <ExchangeRate class="entity"> 
      <ExchangeRate>500.000000000000</ExchangeRate> 
      <ValidFrom>2013-05-17</ValidFrom> 
      </ExchangeRate> 
      <RateType class="entity"> 
      <Name>Default</Name> 
      </RateType> 
     </CurrencyPair> 
     </LedgerExchangeRate> 
    </MessageParts> 
    </Body> 
</Envelope> 

После преобразования, файл будет как:

<?xml version="1.0" encoding="utf-8"?> 
<exchangeRateImport action="create" xmlns="http://schemas.v.com/2005/ImosOps" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <baseCurrency>US</baseCurrency> 
    <currency>EU</currency> 
    <rate>55.00000000</rate> 
    <effectiveDate>2013-05-17</effectiveDate> 
</exchangeRateImport> 

Я создал XLRT следующим образом, результаты которого по-разному. Пожалуйста помоги.

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
       xmlns:axEnv="http://schemas.microsoft.com/dynamics/2011/01/documents/Message" 
       xmlns:axExchRate="http://schemas.microsoft.com/dynamics/2008/01/documents/LedgerExchangeRate"> 
    <xsl:output method="xml" indent="yes" encoding="utf-8" omit-xml-declaration="no"/> 
    <xsl:template match="/"> 
    <exchangeRateImport imosMsg:action="update" xmlns:imosMsg="http://schemas.veson.com/2005/ImosMsg" xmlns="http://schemas.veson.com/2005/ImosOps" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <baseCurrency> 
     <xsl:value-of select="axEnv:Envelope/axEnv:body/axEnv:MessageParts/axExchRate:LedgerExchangeRate/axExchRate:CurrencyPair/axExchRate:FromCurrencyCode"/> 
     </baseCurrency> 
     <currency/> 
     <rate/> 
     <effectiveDate/> 
    </exchangeRateImport> 
    </xsl:template> 
</xsl:stylesheet> 

Результат:

<exchangeRateImport imosMsg:action="update" xmlns="http://schemas.veson.com/2005/ImosOps" xmlns:imosMsg="http://schemas.veson.com/2005/ImosMsg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:axEnv="http://schemas.microsoft.com/dynamics/2011/01/documents/Message" xmlns:axExchRate="http://schemas.microsoft.com/dynamics/2008/01/documents/LedgerExchangeRate"><baseCurrency></baseCurrency><currency /><rate /><effectiveDate /></exchangeRateImport> 

ответ

1

Основная причина вашего преобразования не работает в том, что axEnv:body элемент не найден, потому что он имеет капитал B в исходном XML.

Я не совсем понимаю, что вам нужно, поскольку XML, который, как вы говорите, вам практически не соответствует исходным данным. Однако вот мое лучшее предположение. Я надеюсь, что это помогает.

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
    xmlns:axEnv="http://schemas.microsoft.com/dynamics/2011/01/documents/Message" 
    xmlns:axExchRate="http://schemas.microsoft.com/dynamics/2008/01/documents/LedgerExchangeRate" 
    exclude-result-prefixes="axEnv axExchRate"> 

    <xsl:output method="xml" indent="yes" encoding="utf-8" omit-xml-declaration="no"/> 

    <xsl:template match="/"> 
    <xsl:apply-templates select="axEnv:Envelope/axEnv:Body/axEnv:MessageParts/axExchRate:LedgerExchangeRate/axExchRate:CurrencyPair"/> 
    </xsl:template> 

    <xsl:template match="axExchRate:CurrencyPair"> 

    <exchangeRateImport 
     imosMsg:action="update" 
     xmlns="http://schemas.veson.com/2005/ImosOps" 
     xmlns:imosMsg="http://schemas.veson.com/2005/ImosMsg" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <baseCurrency> 
     <xsl:value-of select="axExchRate:FromCurrencyCode"/> 
     </baseCurrency> 
     <currency> 
     <xsl:value-of select="axExchRate:ToCurrencyCode"/> 
     </currency> 
     <rate> 
     <xsl:value-of select="axExchRate:ExchangeRate/axExchRate:ExchangeRate"/> 
     </rate> 
     <effectiveDate> 
     <xsl:value-of select="axExchRate:ExchangeRate/axExchRate:ValidFrom"/> 
     </effectiveDate> 
    </exchangeRateImport> 

    </xsl:template> 

</xsl:stylesheet> 

выход

<?xml version="1.0" encoding="utf-8"?> 
<exchangeRateImport 
    xmlns="http://schemas.veson.com/2005/ImosOps" 
    xmlns:imosMsg="http://schemas.veson.com/2005/ImosMsg" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    imosMsg:action="update"> 

    <baseCurrency>US</baseCurrency> 
    <currency>DKK</currency> 
    <rate>500.000000000000</rate> 
    <effectiveDate>2013-05-17</effectiveDate> 
</exchangeRateImport> 
+0

Привет Бородин, Прежде всего, большое спасибо за ур вклад. Действительно ценю это. – Dip

+0

Привет, Бородин, большое спасибо за вклад ура. Действительно ценю это. В принципе, исходная система «dynamic ax» генерирует xml-файл на основе собственного xsd, где в качестве целевого xml имеет формат dfrnt, но набор информации фиксирован. Итак, в исходной системе есть возможность загрузить файл xsl, который будет выполнять преобразование из исходного xml. Мы называем это AIF (Application Integration Framework). Я только начал изучать xslt. Могу ли я узнать, возможно ли удалить пространства имен в качестве xmlns: axEnv = "http: ../ documents/Message" и xmlns: axExchRate = "http: .. LedgerExchangeRate" из выходного файла – Dip

+0

@ Dip: Да, вы можете добавить атрибут 'exclude-result-prefixes'' корневого элемента ''. Я изменил свой ответ соответственно. – Borodin

Смежные вопросы