2015-02-04 3 views
0

저는 XSLT에서 새로운 꿀벌입니다. 하지만 아래의 요구 사항은 XSLT를 사용하여 달성 할 수 있습니다. 이제 두 개의 다른 xml을 하나로 병합해야하는 요구 사항이 있으며 xslt가 node1과 node1과 같은 노드 이름을 확인할 수 있어야합니다. input2/nodeName과 일치하면 input2에서 값을 채울 필요가 있습니다.xslt를 사용하여 두 xml 노드 값 병합 및 업데이트

예 :

입력 1 XML :

<Parent> 
    <C1>123</C1> 
    <C2>Incorrect data</C2> 
    <C3>789</C3> 
</Parent> 

입력 2의 XML :

<NewParent> 
    <C2>CorrectData</C2> 
</NewParent> 

출력은 : I가 모두 합류 XSLT 이하 시도

<Parent> 
    <C1>123</C1> 
    <C2>CorrectData</C2> 
    <C3>789</C3> 
</Parent> 

있어야 그러나 해결책을 찾지 못했습니다.

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:param name="input1" select="input1.xml" /> 
    <xsl:param name="input2" select="input2.xml" /> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="/"> 
     <xsl:copy> 
      <xsl:for-each select="/*"> 
       <xsl:choose> 
        <xsl:when 
         test="$input1//node() = $input2//node()"> 
         <xsl:value-of select="$input2/node()" /> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:apply-templates select="@* | node()" /> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:for-each> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

이며 스타일 시트가 일부 노드 세트 오류로 종료됩니다.

참고 : 결과를 얻으려면 nodeName (예 : c1, c2)을 지정하지 말고 XSLT 코드에서 위치를 지정하지 마십시오. 그것은 일반적이어야합니다.

추가 정보가 필요하면 알려주십시오. 그리고 제 질문이 명확하지 않은지 알려주세요.

+0

이 서식 도움을 살펴 보시기 바랍니다. –

+0

직접 구현하기 전에 Oliver Becker의 병합 알고리즘을 사용해보십시오. https://www2.informatik.hu-berlin.de/~obecker/XSLT/merge/merge.xslt.html. –

답변

0

이 시도 :

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes" /> 
<xsl:variable name="input1" select="document('input1.xml')" /> 
<xsl:variable name="input2" select="document('input2.xml')" /> 
<xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()" /> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="/"> 
    <xsl:copy> 
     <xsl:for-each select="$input1/*"> 
      <xsl:copy> 
       <xsl:for-each select="*"> 
        <xsl:choose> 
         <xsl:when test="name() = $input2//name()"> 
          <xsl:copy-of select="$input2/*/node()" /> 
         </xsl:when> 
         <xsl:otherwise> 
          <xsl:copy-of select="." /> 
         </xsl:otherwise> 
        </xsl:choose> 
       </xsl:for-each> 
      </xsl:copy> 
     </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

출력 : http://stackoverflow.com/editing-help#code : 다음 질문

<Parent> 
<C1>123</C1> 
<C2>CorrectData</C2> 
<C3>789</C3> 
</Parent> 
+0

Rudramuni - 답장을 보내 주셔서 감사합니다. 나는 당신이 제안한 업데이트를 시도했지만 페이로드를 업데이트하지 않는다. 위의 xslt를 적용했다. 출력 iam 가져 오는 동일한 input1 xml (출력)입니다. –

+0

Uday, 외부 파일 이름과 관련하여 XSLT에 제공된 파일 이름을 확인하십시오. –

+0

안녕하세요 Rudramuni, 전에 "나는 당신이 말한 것을 시도했다 ..."그것은 xslt 코드 내에서 입력 된 XML의 phisical 위치를 알려주지 않고도 xslt 코드를 실행할 수 있습니까? 실제로 나는 입력 된 XML을 동적으로 전달해야한다. (소소한 물리적 위치에서 가져 오지 않는다.) 그래서 xslt는 param1과 param2의 입력 (xmls)을 모두 수신 할 수 있어야합니다. (이 같은 것이어야합니까?) 자세한 정보가 필요하면 알려주십시오 ... 여러 방법을 시도했지만 운이 없음을 발견했습니다. . ... –

관련 문제