我发现命名空间有问题,希望能得到您的帮助。
原始XML:
<?xml version="1.0" encoding="UTF-8"?>
<SyncItemMaster xmlns="http://schema.xxx.com/xxxOAGIS/2" >
<ApplicationArea>
<Sender>
<LogicalID schemeVersionID="16.0.0.051">lid://in.m4.m4</LogicalID>
<ComponentID schemeVersionID="16.0.0.20210322170049">M4BEX</ComponentID>
<ConfirmationCode>OnError</ConfirmationCode>
</Sender>
<CreationDateTime>2021-06-17T18:42:31.420Z</CreationDateTime>
<BODID>e99a31bc-4ad5-45e1-a27b-10b27b9511c6</BODID>
</ApplicationArea>
<DataArea>
<ItemMaster>
<ItemMasterHeader>
<Description>JADE COLL 5-5/8 X 48 W/PAD</Description>
<Description type="ShortName">4MM GEMCORE ARCTIC 12MIL</Description>
<Classification>
<Codes>
<Code listID="Item Groups" sequence="1">00006002</Code>
</Codes>
</Classification>
<Classification>
<Codes>
<Code sequence="1" listID="Item Types">E01</Code>
</Codes>
</Classification>
<UserArea>
<Property>
<NameValue name="Free1">679QB</NameValue>
</Property>
<Property>
<NameValue name="Free2">0.00</NameValue>
</Property>
</UserArea>
</ItemMasterHeader>
</ItemMaster>
</DataArea>
</SyncItemMaster>XSLT是
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://schema.xxx.com/xxxOAGIS/2" >
<xsl:output method="xml" encoding="UTF-8" indent="no" byte-order-mark="no"/>
<xsl:strip-space elements="*"/>
<!-- Copy whole source doc. to target -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//*:ItemMasterHeader">
<xsl:copy>
<xsl:copy-of select="Description|Classification"/>
<Classification>
<Codes>
<Code listID="RESPQQQ" sequence="1"></Code>
</Codes>
</Classification>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>我的结果是
<SyncItemMaster xmlns="http://schema.xxx.com/xxxOAGIS/2">
<ApplicationArea>
<Sender>
<LogicalID schemeVersionID="16.0.0.051">lid://in.m4.m4</LogicalID>
<ComponentID schemeVersionID="16.0.0.20210322170049">M4BEX</ComponentID>
<ConfirmationCode>OnError</ConfirmationCode>
</Sender>
<CreationDateTime>2021-06-17T18:42:31.420Z</CreationDateTime>
<BODID>e99a31bc-4ad5-45e1-a27b-10b27b9511c6</BODID>
</ApplicationArea>
<DataArea>
<ItemMaster>
<ItemMasterHeader>
<Classification>
<Codes>
<Code listID="RESPQQQ" sequence="1"/>
</Codes>
</Classification>
</ItemMasterHeader>
</ItemMaster>
</DataArea>
</SyncItemMaster>这是不正确的,因为我的xslt是复制整个文档。指向并插入RESPQQQ元素。
下面是我所期望的xml。
<SyncItemMaster xmlns="http://schema.xxx.com/xxxOAGIS/2">
<ApplicationArea>
<Sender>
<LogicalID schemeVersionID="16.0.0.051">lid://in.m4.m4</LogicalID>
<ComponentID schemeVersionID="16.0.0.20210322170049">M4BEX</ComponentID>
<ConfirmationCode>OnError</ConfirmationCode>
</Sender>
<CreationDateTime>2021-06-17T18:42:31.420Z</CreationDateTime>
<BODID>e99a31bc-4ad5-45e1-a27b-10b27b9511c6</BODID>
</ApplicationArea>
<DataArea>
<ItemMaster>
<ItemMasterHeader>
<Description>JADE COLL 5-5/8 X 48 W/PAD</Description>
<Description type="ShortName">4MM GEMCORE ARCTIC 12MIL</Description>
<Classification>
<Codes>
<Code listID="Item Groups" sequence="1">00006002</Code>
</Codes>
</Classification>
<Classification>
<Codes>
<Code sequence="1" listID="Item Types">E01</Code>
</Codes>
</Classification>
<Classification>
<Codes>
<Code listID="RESPQQQ" sequence="1"/>
</Codes>
</Classification>
<UserArea>
<Property>
<NameValue name="Free1">679QB</NameValue>
</Property>
<Property>
<NameValue name="Free2">0.00</NameValue>
</Property>
</UserArea>
</ItemMasterHeader>
</ItemMaster>
</DataArea>
</SyncItemMaster>因此,如何修复XSLT才能在XML中使用该名称空间呢?非常感谢你的帮助。
发布于 2021-06-29 06:42:24
实现这一点的一种方法是使用以下样式表:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:oagis="http://schema.xxx.com/xxxOAGIS/2" >
<xsl:output method="xml" encoding="UTF-8" indent="no" byte-order-mark="no"/>
<xsl:strip-space elements="*"/>
<!-- Copy whole source doc. to target -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="oagis:*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="node() | @*"/>
</xsl:element>
</xsl:template>
<xsl:template match="oagis:UserArea">
<xsl:element name="Classification" xmlns="http://schema.xxx.com/xxxOAGIS/2">
<xsl:element name="Codes">
<xsl:element name="Code">
<xsl:attribute name="listID">RESPQQQ</xsl:attribute>
<xsl:attribute name="sequence">1</xsl:attribute>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>它的输出是
<?xml version="1.0" encoding="UTF-8"?>
<SyncItemMaster>
<ApplicationArea>
<Sender>
<LogicalID schemeVersionID="16.0.0.051">lid://in.m4.m4</LogicalID>
<ComponentID schemeVersionID="16.0.0.20210322170049">M4BEX</ComponentID>
<ConfirmationCode>OnError</ConfirmationCode>
</Sender>
<CreationDateTime>2021-06-17T18:42:31.420Z</CreationDateTime>
<BODID>e99a31bc-4ad5-45e1-a27b-10b27b9511c6</BODID>
</ApplicationArea>
<DataArea>
<ItemMaster>
<ItemMasterHeader>
<Description>JADE COLL 5-5/8 X 48 W/PAD</Description>
<Description type="ShortName">4MM GEMCORE ARCTIC 12MIL</Description>
<Classification>
<Codes>
<Code listID="Item Groups" sequence="1">00006002</Code>
</Codes>
</Classification>
<Classification>
<Codes>
<Code sequence="1" listID="Item Types">E01</Code>
</Codes>
</Classification>
<Classification xmlns="http://schema.xxx.com/xxxOAGIS/2">
<Codes>
<Code listID="RESPQQQ" sequence="1"/>
</Codes>
</Classification>
</ItemMasterHeader>
</ItemMaster>
</DataArea>
</SyncItemMaster>这应该和预期的一样。
发布于 2021-06-29 08:13:08
我怀疑你真的想做这样的事情:
XSLT2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="http://schema.xxx.com/xxxOAGIS/2"
xmlns="http://schema.xxx.com/xxxOAGIS/2" >
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ItemMasterHeader">
<xsl:copy>
<xsl:copy-of select="Description|Classification"/>
<Classification>
<Codes>
<Code listID="RESPQQQ" sequence="1"/>
</Codes>
</Classification>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>这将保留所有复制的元素在其原始名称空间中,并将添加的Classification元素放在相同的名称空间中-因此结果为:
结果
<?xml version="1.0" encoding="utf-8"?>
<SyncItemMaster xmlns="http://schema.xxx.com/xxxOAGIS/2">
<ApplicationArea>
<Sender>
<LogicalID schemeVersionID="16.0.0.051">lid://in.m4.m4</LogicalID>
<ComponentID schemeVersionID="16.0.0.20210322170049">M4BEX</ComponentID>
<ConfirmationCode>OnError</ConfirmationCode>
</Sender>
<CreationDateTime>2021-06-17T18:42:31.420Z</CreationDateTime>
<BODID>e99a31bc-4ad5-45e1-a27b-10b27b9511c6</BODID>
</ApplicationArea>
<DataArea>
<ItemMaster>
<ItemMasterHeader>
<Description>JADE COLL 5-5/8 X 48 W/PAD</Description>
<Description type="ShortName">4MM GEMCORE ARCTIC 12MIL</Description>
<Classification>
<Codes>
<Code listID="Item Groups" sequence="1">00006002</Code>
</Codes>
</Classification>
<Classification>
<Codes>
<Code sequence="1" listID="Item Types">E01</Code>
</Codes>
</Classification>
<Classification>
<Codes>
<Code listID="RESPQQQ" sequence="1"/>
</Codes>
</Classification>
</ItemMasterHeader>
</ItemMaster>
</DataArea>
</SyncItemMaster>注意,UserArea元素并没有被复制;我不确定这是您真正想要的,还是只是您的一个遗漏。
https://stackoverflow.com/questions/68169910
复制相似问题