首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT插入XML问题中的两个不同元素

XSLT插入XML问题中的两个不同元素
EN

Stack Overflow用户
提问于 2021-06-26 04:23:16
回答 2查看 40关注 0票数 1

以下是我的原始XML

代码语言:javascript
复制
<?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中插入

  1. 的另一个分类

代码语言:javascript
复制
      <Classification>
        <Codes>
          <Code listID="RESPQQQ" sequence="1"></Code>
        </Codes>
      </Classification>

  1. 在UserArea

中插入另一个属性

代码语言:javascript
复制
      <Property>
    <NameValue name="RESPZ">zzzz</NameValue>
  </Property>

所得到的XML就是这样的。

代码语言:javascript
复制
<?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是..。

代码语言:javascript
复制
<?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是这样的..。

代码语言:javascript
复制
<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有什么问题吗?

谢谢你提前帮忙。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-26 04:41:09

由于需要将新节点放在同名节点之后,所以在ItemMasterHeaderUserArea模板下复制所有子节点,按照相应的顺序添加新节:

代码语言:javascript
复制
<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>
票数 0
EN

Stack Overflow用户

发布于 2022-06-13 14:18:57

代码语言:javascript
复制
<?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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68139197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档