XSLT在XML元素中避免xmlns =“”

时间:2019-11-22 15:51:39

标签: xml xslt xslt-2.0

我正在努力转换随附的文档。我尝试了各种方案,但是我认为问题是我泄漏了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&amp;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&amp;verb=Sync</BODID>
  </ApplicationArea>
  <DataArea xmlns="">
...

1 个答案:

答案 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&amp;verb=Sync</xsl:text>
    </BODID>
</xsl:template>

</xsl:stylesheet>

请注意xsl:stylesheet起始标记中的默认名称空间声明。