2014-09-30 4 views
0

2 개의 XML 파일을 코드의 문자열로 병합하려고합니다.XSL 변환 - 요소 병합

<Root> 
    <AMA> 
     <Profile> 
      <UniqueID id="3"/> 
      <Name type="UN">TOTO</Name> 
      <Address>AAA</Address> 
     </Profile> 
     <Profile> 
      <UniqueID id="4"/> 
      <Name>TOTA</Name> 
      <Address>BBB</Address> 
     </Profile> 
     <Profile> 
      <UniqueID id="5"/> 
      <Name>TOTQ</Name> 
     </Profile> 
     <Profile> 
      <UniqueID id="6"/> 
      <Name>TOTG</Name> 
     </Profile> 
     <Profile> 
      <UniqueID id="7"/> 
      <Name>TOTB</Name> 
      <Address>CCC</Address> 
     </Profile> 
    </AMA> 
    <External> 
     <Profile> 
      <UniqueID id="3"/> 
      <Miles>5</Miles> 
     </Profile> 
     <Profile> 
      <UniqueID id="4"/> 
      <Miles>4</Miles> 
<Points>22222</Points> 
     </Profile> 
     <Profile> 
      <UniqueID id="5"/> 
      <Miles>3</Miles> 
     </Profile> 
     <Profile> 
      <UniqueID id="6"/> 
      <Miles>2</Miles> 
     </Profile> 
     <Profile> 
      <UniqueID id="7"/> 
      <Miles>1</Miles> 
     </Profile> 
    </External> 
</Root> 

나는 내가 좋아하는 뭔가를 작성하는 관리

<?xml version="1.0" encoding="ISO-8859-1"?> 
<Root> 
    <Profile> 
     <UniqueID id="3"/> 
     <Name type="UN">TOTO</Name> 
     <Address>AAA</Address> 
     <Miles>5</Miles> 
    </Profile> 
    <Profile> 
     <UniqueID id="4"/> 
     <Name>TOTA</Name> 
     <Address>BBB</Address> 
     <Miles>4</Miles> 
     <Points>22222</Points> 
    </Profile> 
    <Profile> 
     <UniqueID id="5"/> 
     <Name>TOTQ</Name> 
     <Miles>3</Miles> 
    </Profile> 
    <Profile> 
     <UniqueID id="6"/> 
     <Name>TOTG</Name> 
     <Miles>2</Miles> 
    </Profile> 
    <Profile> 
     <UniqueID id="7"/> 
     <Name>TOTB</Name> 
     <Address>CCC</Address> 
     <Miles>1</Miles> 
    </Profile> 
</Root> 

가져올 :

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes" /> 
    <Root> 
    <xsl:template match="/Root/AMA/Profile"> 
     <Profile> 
      <xsl:for-each select="."> 
       <xsl:copy-of select="@*|node()"/> 
       <xsl:copy-of select="/Root/External/Profile/UniqueID[@id=current()/UniqueID/@id]/../(Miles|Points)"/> 
      </xsl:for-each> 
     </Profile> 
    </xsl:template> 
    <xsl:template match="/root/External"/> 
</xsl:transform> 
    </Root> 

방법은 프로파일 노드를 "하드 코딩"피할 수있다? 는 XML 변환의 프로필 요소 태그 개방 및 폐쇄 내 손을 넣어하지만, 그냥 원래 하나에서 프로필 노드를 복사하지 "내 말은"하드 코딩 "으로

.

그것은 다른 방법을 보인다

사용하여 존재 XSLT Lookup Tableshere ...하지만 조금 지나친 것 같습니다.

당신이 더 나은 솔루션이 있다고 생각합니까?

+0

으로 변경할 수 있습니까? "프로필 노드를 하드 코딩"이란 무엇입니까? –

+0

나는 당신이 무엇을 요구하고 있는지 정말로 확신하지 못합니다. 여러분이 사용하는 두 개의 문서가 아닌 하나의 입력 문서를 보여 주었고 병합 작업을 수행하기를 원하는 것에 대한 좋은 설명을 제공하지 못했습니다. 그리고 @KirillPolishchuk에 동의합니다. "프로파일 노드 하드 코딩"의 의미가 명확하지 않습니다. 현재 접근 방식으로는 할 수없는 일을하고 싶습니다. 또한 스타일 시트가 잘못 작성되었음을 유의하십시오. 루트 요소가 올바르게 중첩되지 않으며 루트 노드 템플릿이 일치 프로세스를 시작하지 않지만 템플릿이 있으므로 풀 스타일 스타일 시트가 아닙니다. 문제를 중지하고 정의하십시오. – keshlam

+0

예, 더 나은 해결책이 있습니다 : ** 키 **를 사용하여 외부 값을 조회하십시오. 아니요, "프로필 노드 *"를 하드 코딩하지 않아도됩니다. 요청의이 부분은 분명하지 않습니다. 다른 사람들이 이미 지적했듯이. - 또한 '는 아무 것도하지 않는다. –

답변

1

그것은 AMAProfile 아이들을 병합하는 것입니다 당신이 일을하려고하는 것처럼 보이는 External.

거의 발생했으나 Root으로 이동하고 xsl:for-each을 제거하고 두 번째 xsl:copy-of에서 select을 업데이트해야합니다. (나는 나의 예에서 첫 번째 xsl:copy-of에 고정 경로를 옮겼습니다.)이 같은

뭔가 ...

XSLT 2.0

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

    <!--This will handle <Root/>--> 
    <xsl:template match="/*"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|AMA/Profile"/> 
     </xsl:copy>   
    </xsl:template> 

    <xsl:template match="/Root/AMA/Profile"> 
     <Profile> 
      <xsl:copy-of select="@*|node()| 
      /*/External/Profile[UniqueID/@id=current()/UniqueID/@id]/(Miles|Points)"/> 
     </Profile> 
    </xsl:template> 

</xsl:stylesheet> 
을 (당신의 XPath에 XSLT 2.0 인해 (Miles|Points) 가정)

XSLT 1.0으로 전환해야하는 경우 (Miles|Points)*[self::Miles or self::Points]

+0

마일스와 포인트가 프로필의 내부 요소에 있고 그것들을 같은 깊이에 유지하고 싶다면 어떨까요? – lucabelluccini