簡體   English   中英

使用XSLT將XML輸出轉換為新結構化的(其他元素)XML時,如何在XML根標記中包含元素

[英]How can I include elements in a XML root tag, when converting a XML-output into a newly structured (other elements) XML using XSLT

從CRM系統中,我獲得了具有所有元素的預定義結構的XML。 我的客戶希望將生成的XML導入他們的ERP中,但是需要對其進行重組以使其適合他們的系統。 我能夠使用XSLT對其進行轉換。 但是,我無法向該元素添加屬性(有關更多詳細信息,請參見下面的代碼)。 有人知道如何在XSLT中對此進行硬編碼,以便在XML中獲得所需的輸出嗎?

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns="com.cisag.app.sales.obj.SalesOrder" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<xsl:import-schema schema-location="SALESORDER.xsd" 
namespace="com.cisag.app.sales.obj.SalesOrder"/>

<xsl:output method="xml" indent="yes" version="1.0" encoding="UTF-8"/>

<xsl:variable name="dateTime" select="//ActionDateTime"/>
<xsl:variable name="date" select="concat(substring($dateTime,9,2), '#', 
substring($dateTime,6,2), '#', substring($dateTime,1,4))"/>

<xsl:template match="/">

    <xsl:element name="semiramis">

        <xsl:element name="SalesOrder">

            <xsl:element name="Type">
                <xsl:element name="code">
                    <xsl:value-of select="105"/>
                </xsl:element>
            </xsl:element>

            <xsl:element name="invoicingPartyData">
                <xsl:element name="Partner">
                    <xsl:element name="number">
                        <xsl:value-of select="0"/>
                    </xsl:element>
                </xsl:element>
            </xsl:element>

            <xsl:element name="customerOrderData">
                <xsl:element name="purchaseOrder">
                    <xsl:value-of select="//WrntyID"/>
                </xsl:element>
                <xsl:element name="date">
                    <xsl:value-of select="$date"/>
                </xsl:element>
            </xsl:element>

            <xsl:element name="imp_description">
                <xsl:value-of select="//Remark"/>
            </xsl:element>

            <xsl:element name="customerData">
                <xsl:element name="CustomerPartner">
                    <xsl:element name="number">
                        <xsl:value-of select="//AccountExternalID"/>
                    </xsl:element>
                </xsl:element>
            </xsl:element>

            <xsl:element name="discountOriginType">
                <xsl:value-of select="('MANUAL')"/>
            </xsl:element>

            <xsl:element name="discounts">
                <xsl:element name="type">
                    <xsl:value-of select="('PERCENT_VALUE')"/>
                </xsl:element>
                <xsl:element name="value">
                    <xsl:value-of select="//DiscountPercentage"/>
                </xsl:element>
                <xsl:element name="DiscountType">
                    <xsl:element name="code">
                        <xsl:value-of select="200"/>
                    </xsl:element>
                </xsl:element>
            </xsl:element>

            <xsl:for-each select="//TransactionLine">
                <xsl:element name="Details">
                    <xsl:element name="Item">
                        <xsl:element name="number">
                            <xsl:value-of select="//ItemExternalID"/>
                        </xsl:element>
                    </xsl:element>
                    <xsl:element name="totalQuantity">
                        <xsl:element name="amount">
                            <xsl:value-of select="//UnitsQuantity"/>
                        </xsl:element>
                        <xsl:element name="Uom">
                            <xsl:element name="code">
                                <xsl:value-of 
select="//ItemTSABasiseinheit"/>
                            </xsl:element>
                        </xsl:element>
                    </xsl:element>
                    <xsl:element name="priceOriginType">
                        <xsl:value-of select="('MANUAL')"/>
                    </xsl:element>
                    <xsl:element name="grossPrice">
                        <xsl:element name="amount">
                            <xsl:value-of select="//TSAPreisvorRabatt"/>
                        </xsl:element>
                        <xsl:element name="Currency">
                            <xsl:element name="isoCode">
                                <xsl:value-of select="('EUR')"/>
                        </xsl:element>
                        </xsl:element>
                    </xsl:element>
                    <xsl:choose>
                        <xsl:when test="//TSAZeilenrabatt">
                            <xsl:element name="discounts">
                                <xsl:element name="type">
                                    <xsl:value-of select=" 
('PERCENT_VALUE')"/>
                                </xsl:element>
                                <xsl:element name="value">
                                    <xsl:value-of 
select="//TSAZeilenrabatt"/>
                                </xsl:element>
                                <xsl:element name="DiscountType">
                                    <xsl:element name="code">
                                        <xsl:value-of select="200"/>
                                    </xsl:element>
                                </xsl:element>
                            </xsl:element>
                        </xsl:when>
                    </xsl:choose>
                    <xsl:element name="imp_deliveryDate">
                        <xsl:element name="dateFrom">
                            <xsl:element name="specialValue">
                                <xsl:value-of select="('NONE')"/>
                            </xsl:element>
                            <xsl:element name="date">
                                <xsl:value-of select="//DeliveryDate"/>
                            </xsl:element>
                            <xsl:element name="timeZone">
                                <xsl:value-of select="('CET')"/>
                            </xsl:element>
                        </xsl:element>
                        <xsl:element name="dateUntil">
                            <xsl:element name="specialValue">
                                <xsl:value-of select="('NONE')"/>
                            </xsl:element>
                            <xsl:element name="date">
                                <xsl:value-of select="//TSALieferdatumBis"/>
                            </xsl:element>
                            <xsl:element name="timeZone">
                                <xsl:value-of select="('CET')"/>
                            </xsl:element>
                        </xsl:element>
                    </xsl:element>
                </xsl:element>
            </xsl:for-each>

        </xsl:element>

    </xsl:element>

</xsl:template>

</xsl:stylesheet>

這是我期望得到的:

<?xml version="1.0" encoding="UTF-8"?>
<semiramis xmlns="com.cisag.app.sales.obj.SalesOrder" 
xsi:schemaLocation="com.cisag.app.sales.obj.SalesOrder SALESORDER.xsd" 
created="2014-04-16T14:03:28.256Z" locale="en-US-XMLSchemaCompliant" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
nlsMode="SINGLE_LANGUAGE" dateTimeMode="NORMALIZED">
<SalesOrder xmlns="com.cisag.app.sales.obj.SalesOrder">
<Type>
  <code></code>
</Type>
<invoicingPartyData>
  <Partner>
    <number></number>
  </Partner>
</invoicingPartyData>
<customerOrderData>
  <purchaseOrder></purchaseOrder>
  <date>08#01#2019</date>
</customerOrderData>
<imp_description></imp_description>
<customerData>
  <CustomerPartner>
    <number></number>
  </CustomerPartner>
</customerData>
<discountOriginType>MANUAL</discountOriginType>
<discounts>
  <type>PERCENT_VALUE</type>
  <value>0</value>
  <DiscountType>
    <code>199</code>
  </DiscountType>
</discounts>
<Details>
  <Item>
    <number>010</number>
  </Item>
  <totalQuantity>
    <amount>900</amount>
    <Uom>
      <code></code>
    </Uom>
  </totalQuantity>
  <priceOriginType>MANUAL</priceOriginType>
  <grossPrice>
    <amount></amount>
    <Currency>
      <isoCode>EUR</isoCode>
    </Currency>
  </grossPrice>
  <discounts>
    <type>PERCENT_VALUE</type>
    <value>13</value>
    <DiscountType>
      <code></code>
    </DiscountType>
    <MeasureUom />
    <MeasureCurrency />
  </discounts>
  <imp_deliveryDate>
    <dateFrom>
      <specialValue>NONE</specialValue>
      <date>2019-01-08</date>
      <timeZone>CET</timeZone>
    </dateFrom>
    <dateUntil>
      <specialValue>NONE</specialValue>
      <date></date>
      <timeZone>CET</timeZone>
    </dateUntil>
  </imp_deliveryDate>
</Details>
</SalesOrder>
</semiramis>

這是我實際上得到的:

<?xml version="1.0" encoding="utf-8"?>
<semiramis xmlns="com.cisag.app.sales.obj.SalesOrder">
<SalesOrder>
<Type>
  <code></code>
</Type>
<invoicingPartyData>
  <Partner>
    <number></number>
  </Partner>
</invoicingPartyData>
<customerOrderData>
  <purchaseOrder></purchaseOrder>
  <date>08#01#2019</date>
</customerOrderData>
<imp_description></imp_description>
<customerData>
  <CustomerPartner>
    <number></number>
  </CustomerPartner>
</customerData>
<discountOriginType>MANUAL</discountOriginType>
<discounts>
  <type>PERCENT_VALUE</type>
  <value>0</value>
  <DiscountType>
    <code>199</code>
  </DiscountType>
</discounts>
<Details>
  <Item>
    <number>010</number>
  </Item>
  <totalQuantity>
    <amount>900</amount>
    <Uom>
      <code></code>
    </Uom>
  </totalQuantity>
  <priceOriginType>MANUAL</priceOriginType>
  <grossPrice>
    <amount></amount>
    <Currency>
      <isoCode>EUR</isoCode>
    </Currency>
  </grossPrice>
  <discounts>
    <type>PERCENT_VALUE</type>
    <value>13</value>
    <DiscountType>
      <code></code>
    </DiscountType>
    <MeasureUom />
    <MeasureCurrency />
  </discounts>
  <imp_deliveryDate>
    <dateFrom>
      <specialValue>NONE</specialValue>
      <date>2019-01-08</date>
      <timeZone>CET</timeZone>
    </dateFrom>
    <dateUntil>
      <specialValue>NONE</specialValue>
      <date></date>
      <timeZone>CET</timeZone>
    </dateUntil>
  </imp_deliveryDate>
</Details>
</SalesOrder>
</semiramis>

要將屬性和名稱空間聲明添加到根semiramis元素,請替換為:

<xsl:element name="semiramis">
... 
</xsl:element>

有:

<semiramis xmlns="com.cisag.app.sales.obj.SalesOrder" 
xsi:schemaLocation="com.cisag.app.sales.obj.SalesOrder SALESORDER.xsd" 
created="2014-04-16T14:03:28.256Z" locale="en-US-XMLSchemaCompliant" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
nlsMode="SINGLE_LANGUAGE" dateTimeMode="NORMALIZED">
...
</semiramis>"

如果其中某些屬性需要動態評估其值,請使用屬性值模板或顯式的xsl:attribute指令-例如:

<semiramis xmlns="com.cisag.app.sales.obj.SalesOrder" 
xsi:schemaLocation="com.cisag.app.sales.obj.SalesOrder SALESORDER.xsd" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
nlsMode="SINGLE_LANGUAGE" dateTimeMode="NORMALIZED">
    <xsl:attribute name="created">
        <xsl:value-of select="something-here"/>
    </xsl:attribute>
    <xsl:attribute name="locale">
        <xsl:value-of select="another-thing-here"/>
    </xsl:attribute>
    ...

注意:通常,最好使用文字結果元素而不是xsl:element IOW,替換類似的東西:

<xsl:element name="Type">
    <xsl:element name="code">
        <xsl:value-of select="105"/>
    </xsl:element>
</xsl:element>

有:

<Type>
  <code>105</code>
</Type>

當需要在運行時動態確定xsl:element的名稱或名稱空間時,請使用xsl:element

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM