从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>
答案 0 :(得分:0)
要将属性和名称空间声明添加到根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>"
如果其中一些属性需要动态评估其值,请使用attribute value template或显式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>
...
注意:通常,最好使用literal result elements而不是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
。