xslt - 在 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/>
解决方案
忽略命名空间前缀是任意的这一事实,并且任何 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>
推荐阅读
- android - 如何将来自 API 的一些 JSON 数据存储在房间数据库中?
- c# - SQLITE 在更新数据库时切断零
- java - 测试行为与实现
- c# - 已经声明了一个名为“s”的本地函数...为什么每次我在 for 循环中更改变量时都会提示这个?
- django-models - 在 Django 模型的列表字段中推送项目
- excel - 如何制作已过滤掉的某个区域的范围?
- c++ - 整数指针数组的元素是否可以指向整数数组?
- wordpress - 顶部导航菜单在使用 GeneratePress 高级版的移动视图中不可见
- c# - 将实体附加到数据库上下文时实例化枚举器后修改了集合
- python - 递归函数体内未定义的“self”不报告 NameError