我正在努力转换随附的文档。我尝试了各种方案,但是我认为问题是我泄漏了XSLT和名称空间的知识。我必须在避免xmlns =“”的输出中得到结果。 谢谢。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:strip-space elements="*"/>
<xsl:variable name="lid" select="SyncItemMaster/DataArea/ItemMaster/ItemMasterHeader/ItemID/ID/@lid" />
<xsl:variable name="itemId" select="SyncItemMaster/DataArea/ItemMaster/ItemMasterHeader/ItemID/ID" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:element name="SyncItemMaster" xmlns="http://schema.infor.com/InforOAGIS/2" >
<xsl:attribute name="xsi:schemaLocation" namespace="http://www.w3.org/2001/XMLSchema-instance">http://schema.infor.com/InforOAGIS/2 http://schema.infor.com/2.10.x/InforOAGIS/BODs/SyncItemMaster.xsd</xsl:attribute>
<xsl:namespace name="xsd" select = "'http://www.w3.org/2001/XMLSchema'" />
<xsl:attribute name="versionID">2.10.x</xsl:attribute>
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="SyncItemMaster/ApplicationArea/Sender/LogicalID">
<xsl:element name="LogicalID"><xsl:value-of select="$lid"/></xsl:element>
</xsl:template>
<xsl:template match="SyncItemMaster/ApplicationArea/Sender/ComponentID">
<xsl:element name="ComponentID">erp</xsl:element>
</xsl:template>
<xsl:template match="SyncItemMaster/ApplicationArea/BODID">
<xsl:element name="BODID"><xsl:value-of select="concat( 'infor-nid:infor:', '515' , '::' ,$itemId, ':' , '?ItemMaster&verb=Sync' )"/></xsl:element>
</xsl:template>
</xsl:stylesheet>
您好,这是我要转换的输入。 SyncMatserItem具有自己正确的名称空间,但我必须从所有降序元素中删除xmlns =“”,例如,。
<SyncItemMaster releaseID="9.2">
<ApplicationArea>
<Sender>
<LogicalID>infor.databaseion_app_6916_Advoco_LN_To_EAM_SyncItemMaster</LogicalID>
<ComponentID>External</ComponentID>
<ConfirmationCode>OnError</ConfirmationCode>
</Sender>
<CreationDateTime>2019-11-20T16:14:38.747Z</CreationDateTime>
<BODID>infor.databaseion_app_6916_Advoco_LN_To_EAM_SyncItemMaster:1574266478747:12561:0</BODID>
</ApplicationArea>
<DataArea>
<Sync>
<TenantID>infor</TenantID>
<AccountingEntityID>515</AccountingEntityID>
<LocationID/>
<ActionCriteria>
<ActionExpression actionCode="Add"/>
</ActionCriteria>
</Sync>
<ItemMaster>
<ItemMasterHeader>
<ItemID>
<ID accountingEntity="515" lid="lid://infor.ln.ln_brubln03_comp-515" variationID="41759">G33167</ID>
</ItemID>
</ItemMasterHeader>
</ItemMaster>
</DataArea></SyncItemMaster>
在这里,实际输出:
<?xml version="1.0" encoding="utf-8"?>
<SyncItemMaster xmlns="http://schema.infor.com/InforOAGIS/2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schema.infor.com/InforOAGIS/2 http://schema.infor.com/2.10.x/InforOAGIS/BODs/SyncItemMaster.xsd" versionID="2.10.x" releaseID="9.2">
<ApplicationArea xmlns="">
<Sender>
<LogicalID>lid://infor.ln.ln_brubln03_comp-515</LogicalID>
<ComponentID>erp</ComponentID>
<ConfirmationCode>OnError</ConfirmationCode>
</Sender>
<CreationDateTime>2019-11-20T16:14:38.747Z</CreationDateTime>
<BODID>infor-nid:infor:515::G33167:?ItemMaster&verb=Sync</BODID>
</ApplicationArea>
<DataArea xmlns="">
...
答案 0 :(得分:1)
您的样式表中有一条说明:
<xsl:template match="/*">
<xsl:element name="SyncItemMaster" xmlns="http://schema.infor.com/InforOAGIS/2" >
<xsl:attribute name="xsi:schemaLocation" namespace="http://www.w3.org/2001/XMLSchema-instance">http://schema.infor.com/InforOAGIS/2 http://schema.infor.com/2.10.x/InforOAGIS/BODs/SyncItemMaster.xsd</xsl:attribute>
<xsl:namespace name="xsd" select = "'http://www.w3.org/2001/XMLSchema'" />
创建的创建一个名为SyncItemMaster
的根元素,该根元素位于http://schema.infor.com/InforOAGIS/2
命名空间中:
<SyncItemMaster xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://schema.infor.com/InforOAGIS/2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://schema.infor.com/InforOAGIS/2 http://schema.infor.com/2.10.x/InforOAGIS/BODs/SyncItemMaster.xsd"
versionID="2.10.x"/>
然后,您还有其他模板可以创建其他元素,这些元素将成为根元素的子代或子代-例如:
<xsl:template match="SyncItemMaster/ApplicationArea/Sender/LogicalID">
<xsl:element name="LogicalID"><xsl:value-of select="$lid"/></xsl:element>
</xsl:template>
创建一个名为LogicalID
的元素,该元素位于无命名空间中。这样的元素将具有一个空的名称空间声明,以表示它不继承其父/祖先的默认名称空间。
因此,根据您的目标架构,将其他所有元素都与根元素放在同一名称空间中,或者不将根元素放在名称空间中。
我猜(!)您想做前者,所以请尝试:
XSLT 1.0
<xsl:stylesheet version=".0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://schema.infor.com/InforOAGIS/2">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- MOVE ALL ELEMENTS TO THE DEFAULT NAMESPACE -->
<xsl:template match="*">
<xsl:element name="{name()}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="/SyncItemMaster">
<SyncItemMaster xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schema.infor.com/InforOAGIS/2 http://schema.infor.com/2.10.x/InforOAGIS/BODs/SyncItemMaster.xsd">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</SyncItemMaster>
</xsl:template>
<xsl:template match="LogicalID">
<LogicalID>
<xsl:value-of select="/SyncItemMaster/DataArea/ItemMaster/ItemMasterHeader/ItemID/ID/@lid"/>
</LogicalID>
</xsl:template>
<xsl:template match="ComponentID">
<ComponentID>erp</ComponentID>
</xsl:template>
<xsl:template match="BODID">
<BODID>
<xsl:text>infor-nid:infor:515::</xsl:text>
<xsl:value-of select="/SyncItemMaster/DataArea/ItemMaster/ItemMasterHeader/ItemID/ID" />
<xsl:text>:?ItemMaster&verb=Sync</xsl:text>
</BODID>
</xsl:template>
</xsl:stylesheet>
请注意xsl:stylesheet
起始标记中的默认名称空间声明。