以下是我的原始XML
<?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>
<UserArea>
<Property>
<NameValue name="Free1">679QB</NameValue>
</Property>
<Property>
<NameValue name="Free2">0.00</NameValue>
</Property>
</UserArea>
</ItemMasterHeader>
</ItemMaster>
</DataArea>
</SyncItemMaster>我需要插入两个元素。
ItemMasterHeader中插入
<Classification>
<Codes>
<Code listID="RESPQQQ" sequence="1"></Code>
</Codes>
</Classification>中插入另一个属性
<Property>
<NameValue name="RESPZ">zzzz</NameValue>
</Property>所得到的XML就是这样的。
<?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>
<Codes>
<Code listID="RESPQQQ" sequence="1"></Code>
</Codes>
</Classification>
<UserArea>
<Property>
<NameValue name="Free1">679QB</NameValue>
</Property>
<Property>
<NameValue name="Free2">0.00</NameValue>
</Property>
<Property>
<NameValue name="RESPZ">zzzz</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" >
<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>
<!-- Add RESP element inside ItemMasterHeader -->
<xsl:template match="//*:ItemMasterHeader">
<xsl:copy>
<xsl:copy-of select="node()|@*"/>
<Classification>
<Codes>
<Code listID="RESPQQQ" sequence="1"></Code>
</Codes>
</Classification>
</xsl:copy>
</xsl:template>
<!-- Add RESP element inside UserArea -->
<xsl:template match="//*:ItemMasterHeader/*:UserArea">
<xsl:copy>
<xsl:copy-of select="node()|@*"/> <!-- now does attrs too -->
<Property>
<NameValue name="RESPZ">zzzz</NameValue>
</Property>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>但是翻译的XML是这样的..。
<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>
<UserArea>
<Property>
<NameValue name="Free1">679QB</NameValue>
</Property>
<Property>
<NameValue name="Free2">0.00</NameValue>
</Property>
</UserArea>
<Classification>
<Codes>
<Code listID="RESPQQQ" sequence="1"/>
</Codes>
</Classification>
</ItemMasterHeader>
</ItemMaster>
</DataArea>
</SyncItemMaster>代码元素在“分类”中。有人能告诉我我的XSLT有什么问题吗?
谢谢你提前帮忙。
发布于 2021-06-26 04:41:09
由于需要将新节点放在同名节点之后,所以在ItemMasterHeader和UserArea模板下复制所有子节点,按照相应的顺序添加新节:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" encoding="UTF-8" indent="yes" 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>
<!-- Add RESP element inside ItemMasterHeader -->
<xsl:template match="ItemMasterHeader">
<xsl:copy>
<xsl:copy-of select="Description|Classification"/>
<Classification>
<Codes>
<Code listID="RESPQQQ" sequence="1"></Code>
</Codes>
</Classification>
<xsl:apply-templates select="UserArea"/>
</xsl:copy>
</xsl:template>
<!-- Add RESP element inside UserArea -->
<xsl:template match="UserArea">
<xsl:copy>
<xsl:copy-of select="Property"/>
<Property>
<NameValue name="RESPZ">zzzz</NameValue>
</Property>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>发布于 2022-06-13 14:18:57
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<!-- Identy template -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- New element added after last "classification" element -->
<xsl:template match="//Classification[last()]">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
<Classification>
<Codes>
<Code listID="RESPQQQ" sequence="1"/>
</Codes>
</Classification>
</xsl:template>
<!-- New element added after last "Property" element -->
<xsl:template match="//Property[last()]">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
<Property>
<NameValue name="RESPZ">zzzz</NameValue>
</Property>
</xsl:template>
</xsl:stylesheet>https://stackoverflow.com/questions/68139197
复制相似问题