使用XSLT将XML输出转换为新结构化的(其他元素)XML时,如何在XML根标记中包含元素

用户名

从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>
michael.hor257k

要将属性和名称空间声明添加到根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:elementIOW,替换类似的东西:

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

与:

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

使用xsl:element时,在运行时动态确定的名称或元素需要的命名空间。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

XSLT将HTML表转换为XML结构化元素

使用 XSLT 将元素转换为属性时,如何在 XML 中设置命名空间?

如何使用 XSLT 2.0 将 csv 文件转换为结构化 XML 文件?

如何使用XSLT / XSL将基于属性的xml转换为json,并忽略especific元素中的属性

将表数据转换为xml结构化数据

使用XSLT将XML属性转换为元素

使用 XSLT 将 XML 元素名称转换为驼峰格式

使用SimpleXML反序列化包含其他xml标记的XML元素作为单个字符串

如何在Apache Commons Configuration中使用addProperty()将新的XML元素添加到分层XML配置的根元素中?

如何将结构化文本文件转换为xml文件api

如何使用xslt转换嵌套的XML元素?

当转换为带有.text的文本时,漂亮的汤XML标记(<>)成为非常非结构化的文本

使用XSLT将旧的XML转换为新的XML格式

使用XSLT将XML转换为XML,并删除特定元素的换行符

如何使用 XSLT 1.0 将平面 XML 结构转换为分层 XML?

使用JAXB从Java对象创建xml时,如何在JAXB中创建嵌套的根元素

如何将嵌套的XML元素转换为平面XML

如何在 XML 元素中包含“/”或“@”?

使用XSLT将XML转换为XML

如何将没有根/父元素的XML转换为struct?

XSLT:如何使用XSLT将xml数据转换为分层结构

使用 XSLT 更改 XML 元素标记

结构化数据格式转换为XML

将XML字符串转换为List <T>而不指定C#中的元素根

如何使用 XSLT 和 Python 将 xml 的子子元素移动到新的 xml 文件?

XSLT将新元素添加到XML的根元素

XSLT将函数应用于元素值并在xml文档的新副本中输出结果

在使用 XSLT 转换为 CSV 时,如果标记在 XML 中不可用,如何添加名称?

将多个 xml 元素转换为单个复杂的 xml 元素