Xml XSLT将父元素添加到子元素

Xml XSLT将父元素添加到子元素,xml,xslt,Xml,Xslt,我试图将某个XML中的一个元素添加到同一XML中的某些子元素中。所讨论的元素已经重复,因此值必须来自XML的正确部分。以下是源XML: <Extract> <Packet> <TXREQUESTID>694154</TXREQUESTID> <Data> <Property> <Key>phoneNumber</Key> </Prope

我试图将某个XML中的一个元素添加到同一XML中的某些子元素中。所讨论的元素已经重复,因此值必须来自XML的正确部分。以下是源XML:

<Extract>
  <Packet>
    <TXREQUESTID>694154</TXREQUESTID>
    <Data>
      <Property>
        <Key>phoneNumber</Key>
      </Property>
      <Property>
        <Key>ownerName</Key>
      </Property>
    </Data>
    <Milestones>
      <Milestone>
        <Code>123123</Code>
      </Milestone>
      <Milestone>
        <Code>123125</Code>
      </Milestone>
    </Milestones>
  </Packet>
  <Packet>
    <TXREQUESTID>694155</TXREQUESTID>
    <Data>
      <Property>
        <Key>phoneNumber</Key>
      </Property>
      <Property>
        <Key>ownerName</Key>
      </Property>
    </Data>
    <Milestones>
      <Milestone>
        <Code>789789</Code>
      </Milestone>
      <Milestone>
        <Code>123126</Code>
      </Milestone>
    </Milestones>
  </Packet>
</Extract>
我需要将TXREQUESTID元素复制为子属性和里程碑元素中的一个元素。完成后,需要如下所示:

<Extract>
  <Packet>
    <TXREQUESTID>694154</TXREQUESTID>
    <Data>
      <Property>
        <Key>phoneNumber</Key>
        <TXREQUESTID>694154</TXREQUESTID>
      </Property>
      <Property>
        <Key>ownerName</Key>
        <TXREQUESTID>694154</TXREQUESTID>
      </Property>
    </Data>
    <Milestones>
      <Milestone>
        <Code>123123</Code>
        <TXREQUESTID>694154</TXREQUESTID>
      </Milestone>
      <Milestone>
        <Code>123125</Code>
        <TXREQUESTID>694154</TXREQUESTID>
      </Milestone>
    </Milestones>
  </Packet>
  <Packet>
    <TXREQUESTID>694155</TXREQUESTID>
    <Data>
      <Property>
        <Key>phoneNumber</Key>
        <TXREQUESTID>694155</TXREQUESTID>
      </Property>
      <Property>
        <Key>ownerName</Key>
        <TXREQUESTID>694155</TXREQUESTID>
      </Property>
    </Data>
    <Milestones>
      <Milestone>
        <Code>789789</Code>
        <TXREQUESTID>694155</TXREQUESTID>
      </Milestone>
      <Milestone>
        <Code>123126</Code>
        <TXREQUESTID>694155</TXREQUESTID>
      </Milestone>
    </Milestones>
  </Packet>
</Extract>
我已经花了好几个小时在这上面了,没有任何运气。这看起来应该很简单,但我发现XSLT语法令人困惑。有人能给我指出正确的方向吗?

从开始,并覆盖要更改的元素(
属性和
里程碑

XML输入

<Extract>
    <Packet>
        <TXREQUESTID>694154</TXREQUESTID>
        <Data>
            <Property>
                <Key>phoneNumber</Key>
            </Property>
            <Property>
                <Key>ownerName</Key>
            </Property>
        </Data>
        <Milestones>
            <Milestone>
                <Code>123123</Code>
            </Milestone>
            <Milestone>
                <Code>123125</Code>
            </Milestone>
        </Milestones>
    </Packet>
    <Packet>
        <TXREQUESTID>694155</TXREQUESTID>
        <Data>
            <Property>
                <Key>phoneNumber</Key>
            </Property>
            <Property>
                <Key>ownerName</Key>
            </Property>
        </Data>
        <Milestones>
            <Milestone>
                <Code>789789</Code>
            </Milestone>
            <Milestone>
                <Code>123126</Code>
            </Milestone>
        </Milestones>
    </Packet>
</Extract>
<Extract>
   <Packet>
      <TXREQUESTID>694154</TXREQUESTID>
      <Data>
         <Property>
            <TXREQUESTID>694154</TXREQUESTID>
            <Key>phoneNumber</Key>
         </Property>
         <Property>
            <TXREQUESTID>694154</TXREQUESTID>
            <Key>ownerName</Key>
         </Property>
      </Data>
      <Milestones>
         <Milestone>
            <TXREQUESTID>694154</TXREQUESTID>
            <Code>123123</Code>
         </Milestone>
         <Milestone>
            <TXREQUESTID>694154</TXREQUESTID>
            <Code>123125</Code>
         </Milestone>
      </Milestones>
   </Packet>
   <Packet>
      <TXREQUESTID>694155</TXREQUESTID>
      <Data>
         <Property>
            <TXREQUESTID>694155</TXREQUESTID>
            <Key>phoneNumber</Key>
         </Property>
         <Property>
            <TXREQUESTID>694155</TXREQUESTID>
            <Key>ownerName</Key>
         </Property>
      </Data>
      <Milestones>
         <Milestone>
            <TXREQUESTID>694155</TXREQUESTID>
            <Code>789789</Code>
         </Milestone>
         <Milestone>
            <TXREQUESTID>694155</TXREQUESTID>
            <Code>123126</Code>
         </Milestone>
      </Milestones>
   </Packet>
</Extract>
XSLT1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

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

    <xsl:template match="Milestone|Property">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()|ancestor::Packet/TXREQUESTID"/>
        </xsl:copy>        
    </xsl:template>

</xsl:stylesheet>
如果元素顺序很重要,请按如下方式拆分
xsl:apply模板

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

几乎任何形式的XSLT问题“我想保持大部分XML不变,但调整X、Y和Z”都可以通过身份转换和一些小心的重写来解决。