2014-04-08 8 views
0

일부 XML의 요소 하나를 동일한 XML의 특정 하위 요소에 추가하려고합니다. 문제의 요소는 이미 반복되므로 값은 XML의 올바른 섹션에 있어야합니다.XSLT 하위 요소에 부모 요소 추가

<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 요소를 복제 할 필요가 : 여기에 소스 XML이다. 완료되면 다음과 같이 표시되어야합니다.

<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 문법을 당황하게하는 것 같습니다. 누구든지 올바른 방향으로 나를 가리킬 수 있습니까? identity transform

+0

꽤 많은 형태의 XSLT 문제 "나는 XML의 가장 같은 유지하지만, X를 조정할하려면, Y와 Z "는 항등 변환과 몇 가지주의 재정의를 사용하여 해결할 수 있습니다. –

답변

2

시작을 변경할 요소 (PropertyMilestone)

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> 

XSLT에 대한 재정의 1.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> 

XML 출력

<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> 

이 요소의 순서가 중요한 경우이 같은 xsl:apply-templates을 분할 :

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

그것은 완벽합니다! 정말 고맙습니다! – user1488803

관련 문제