首页 > 解决方案 > 在 xml 中使用多个命名空间

问题描述

我有一个包含两个命名空间的 xml。我需要将一个更改为ns0,另一个更改为ns1。命名空间http://www.nrf-arts.org/IXRetail/namespace/需要添加为 ns0,http ://www.datavantagecorp.com/xstore/ 需要添加为 ns1。基本上,第二个命名空间是一个引用命名空间。

我试过下面的代码。但这对我没有帮助。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://sample.com/s" 
xmlns:ns0="http://www.nrf-arts.org/IXRetail/namespace/" xmlns:ns1="http://www.datavantagecorp.com/xstore/" 
xmlns:dtv="http://www.datavantagecorp.com/xstore/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xs="http://www.w3.org/2001/XMLSchema">

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

<xsl:strip-space elements="*"/>

<xsl:template match="/">

<xsl:copy>

<xsl:apply-templates select="@* | node()"/>

</xsl:copy>

</xsl:template>

<xsl:template match="node()[not(self::dtv)]">

<xsl:element name="ns0:{local-name()}">

<xsl:apply-templates select="@* | node()"/>

</xsl:element>

</xsl:template>

<xsl:template match="dtv:*">

<xsl:element name="ns1:{local-name()}">

<xsl:apply-templates select="@* | node()"/>

</xsl:element>

</xsl:template>

</xsl:stylesheet>

我的结构

<?xml version="1.0" encoding="UTF-8"?>
<Sales_Posting>
   <row>
      <POSLog xmlns="http://www.nrf-arts.org/IXRetail/namespace/"
              xmlns:dtv="http://www.datavantagecorp.com/xstore/"
              xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
              xs:schemaLocation="http://www.nrf-arts.org/IXRetail/namespace/ POSLog.xsd">
         <Transaction CancelFlag="true"
                      OfflineFlag="false"
                      TrainingModeFlag="false"
                      dtv:AppVersion="17.0.0.0.716 - 0.0.0 - 0.0"
                      dtv:TransactionType="RETAIL_SALE">
            <dtv:OrganizationID>1</dtv:OrganizationID>
            <RetailStoreID>103</RetailStoreID>
            <WorkstationID>3</WorkstationID>
            <TillID>47957</TillID>
            <SequenceNumber>1396</SequenceNumber>
            <BusinessDayDate>2019-05-08</BusinessDayDate>
            <BeginDateTime>2019-05-08T14:51:48.731</BeginDateTime>
            <EndDateTime>2019-05-23T23:37:41.209</EndDateTime>
            <OperatorID>47957</OperatorID>
            <CurrencyCode>INR</CurrencyCode>
            <RollOverCode>0</RollOverCode>
            <MMSTxnType>87</MMSTxnType>

预期输出:-

<?xml version="1.0" encoding="UTF-8"?>
<ns0:Sales_Posting xmlns:ns0="http://www.nrf-arts.org/IXRetail/namespace/">
   <ns0:row>
      <ns0:POSLog>
         <ns0:Transaction CancelFlag="false" TrainingModeFlag="false" OfflineFlag="" ns1:TransactionType="" ns1:AppVersion="17.0.0.0.716 - 0.0.0 - 0.0" ns1:crossChannelReturn="" ns1:InventoryDocumentSubType="" ns1:InventoryDocumentType="" xmlns:ns1="http://www.datavantagecorp.com/xstore/">
            <ns1:OrganizationID xmlns:ns1="http://www.datavantagecorp.com/xstore/">1</ns1:OrganizationID>
            <ns0:RetailStoreID>103</ns0:RetailStoreID>
            <ns0:WorkstationID>3</ns0:WorkstationID>
            <ns0:TillID>47957</ns0:TillID>
            <ns1:CashDrawerID xmlns:ns1="http://www.datavantagecorp.com/xstore/"/>
            <ns0:SequenceNumber/>
            <ns0:BusinessDayDate/>
            <ns0:BeginDateTime/>
            <ns0:EndDateTime/>
            <ns0:OperatorID/>
            <ns0:CurrencyCode/>
            <ns1:FiscalNumber xmlns:ns1="http://www.datavantagecorp.com/xstore/"/>
            <ns1:DeviceId xmlns:ns1="http://www.datavantagecorp.com/xstore/"/>
            <ns1:FiscalSessionNumber xmlns:ns1="http://www.datavantagecorp.com/xstore/"/>
            <ns1:PosTransactionProperties xmlns:ns1="http://www.datavantagecorp.com/xstore/"/>
            <ns0:RollOverCode/>
            <ns0:MMSTxnType/>
            <ns0:SuspendReasonCode/>
            <ns0:MMSReasonType/>
            <ns0:MEPNumber/>
            <ns0:TransactionComment/>
            <ns0:TransNumberReturnWOReceipt/>

标签: xsltxslt-1.0

解决方案


忽略命名空间前缀是任意的这一事实,并且任何 XML 解析器都不应该关心它们是什么(只要实际命名空间符合预期),以下内容应该对您有所帮助:

样式表

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns0="http://www.nrf-arts.org/IXRetail/namespace/"
    xmlns:ns1="http://www.datavantagecorp.com/xstore/"
    xmlns:dtv="http://www.datavantagecorp.com/xstore/">

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

    <xsl:strip-space elements="*" />

    <xsl:template match="@*">
        <xsl:copy-of select="." />
    </xsl:template>

    <xsl:template match="dtv:*">
        <xsl:element name="ns1:{local-name(.)}">
            <xsl:value-of select="text()" />
            <xsl:apply-templates select="@* | node()" />
        </xsl:element>
    </xsl:template>

    <xsl:template match="node()[local-name() != '']">
        <xsl:element name="ns0:{local-name()}">
            <xsl:value-of select="text()" />
            <xsl:apply-templates select="@* | node()" />
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

三个模板:

  • 匹配任何属性并复制它们。
  • 匹配dtv命名空间中的任何内容,将前缀重命名为ns1并复制文本内容并递归映射任何子项
  • 匹配任何其他节点并应用http://www.nrf-arts.org/IXRetail/namespace/ns0前缀的命名空间,复制文本内容并递归映射任何子节点

我认为您的输入在问题中被截断,但它似乎起到了作用。

输入

<?xml version="1.0" encoding="UTF-8"?>
<Sales_Posting>
    <row>
        <POSLog xmlns="http://www.nrf-arts.org/IXRetail/namespace/"
            xmlns:dtv="http://www.datavantagecorp.com/xstore/"
            xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
            xs:schemaLocation="http://www.nrf-arts.org/IXRetail/namespace/ POSLog.xsd">
            <Transaction CancelFlag="true" OfflineFlag="false"
                TrainingModeFlag="false" dtv:AppVersion="17.0.0.0.716 - 0.0.0 - 0.0"
                dtv:TransactionType="RETAIL_SALE">
                <dtv:OrganizationID>1</dtv:OrganizationID>
                <RetailStoreID>103</RetailStoreID>
                <WorkstationID>3</WorkstationID>
                <TillID>47957</TillID>
                <SequenceNumber>1396</SequenceNumber>
                <BusinessDayDate>2019-05-08</BusinessDayDate>
                <BeginDateTime>2019-05-08T14:51:48.731</BeginDateTime>
                <EndDateTime>2019-05-23T23:37:41.209</EndDateTime>
                <OperatorID>47957</OperatorID>
                <CurrencyCode>INR</CurrencyCode>
                <RollOverCode>0</RollOverCode>
                <MMSTxnType>87</MMSTxnType>
            </Transaction>
        </POSLog>
    </row>
</Sales_Posting>

输出

<?xml version="1.0" encoding="UTF-8"?>
<ns0:Sales_Posting
    xmlns:ns0="http://www.nrf-arts.org/IXRetail/namespace/">
    <ns0:row>
        <ns0:POSLog
            xs:schemaLocation="http://www.nrf-arts.org/IXRetail/namespace/ POSLog.xsd"
            xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
            <ns0:Transaction CancelFlag="true"
                OfflineFlag="false" TrainingModeFlag="false"
                dtv:AppVersion="17.0.0.0.716 - 0.0.0 - 0.0"
                xmlns:dtv="http://www.datavantagecorp.com/xstore/"
                dtv:TransactionType="RETAIL_SALE">
                <ns1:OrganizationID
                    xmlns:ns1="http://www.datavantagecorp.com/xstore/">1</ns1:OrganizationID>
                <ns0:RetailStoreID>103</ns0:RetailStoreID>
                <ns0:WorkstationID>3</ns0:WorkstationID>
                <ns0:TillID>47957</ns0:TillID>
                <ns0:SequenceNumber>1396</ns0:SequenceNumber>
                <ns0:BusinessDayDate>2019-05-08</ns0:BusinessDayDate>
                <ns0:BeginDateTime>2019-05-08T14:51:48.731</ns0:BeginDateTime>
                <ns0:EndDateTime>2019-05-23T23:37:41.209</ns0:EndDateTime>
                <ns0:OperatorID>47957</ns0:OperatorID>
                <ns0:CurrencyCode>INR</ns0:CurrencyCode>
                <ns0:RollOverCode>0</ns0:RollOverCode>
                <ns0:MMSTxnType>87</ns0:MMSTxnType>
            </ns0:Transaction>
        </ns0:POSLog>
    </ns0:row>
</ns0:Sales_Posting>

推荐阅读