2013-06-13 7 views
0

xslt를 처음 사용하고 며칠 이후로 다른 옵션을 시도하고 있습니다.xslt를 사용하여 2 개의 연속 요소를 1로 병합하십시오.

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<MAIN> 
    <ProcessResponse> 
     <ORDERNO>workorder123</ORDERNO> 
     <NAME>BD-OC 102</NAME> 
     <FID>124</FID> 
     <FNO>57</FNO>  
     <AID>126</AID> 
     <BID>125</BID> 

    </ProcessResponse> 
    <ProcessResponse> 
     <ORDERNO>workorder123</ORDERNO> 
     <NAME>BD-OC 102</NAME> 
     <FID>125</FID> 
     <FNO>58</FNO> 
     <AID>127</AID> 
     <BID>128</BID> 

    </ProcessResponse> 
    <ProcessResponse> 
     <ORDERNO>workorder124</ORDERNO> 
     <NAME>BD-OC 102</NAME> 
     <FID>130</FID> 
     <FNO>59</FNO>  
     <AID>132</AID> 
     <BID>131</BID> 

    </ProcessResponse> 
    <ProcessResponse> 
     <ORDERNO>workorder124</ORDERNO> 
     <NAME>BD-OC 102</NAME> 
     <FID>132</FID> 
     <FNO>60</FNO> 
     <AID>133</AID> 
     <BID>134</BID> 

    </ProcessResponse> 

</MAIN> 

그리고 내가 기대하고있는 출력 기본적으로 같은 (이다 가지 (더 때문에 XSLT에 대한 지식의 나의 부족의) 아래 시나리오 붙어 아이디어에서

입력 XML은 같은이 있습니까 2 개의 연속되는 모든 요소를 ​​1로 병합하여 공통적이지 않은 부분을 병합 시키길 원합니다.) 절차 적 언어에서는 간단해야하지만 xslt에서 재귀 적으로 시도했지만 원하는 결과를 얻지 못했습니다. 변환 후

출력 :

<Response> 
    <Process> 
     <ORDERNO>workorder123</ORDERNO> 
     <NAME>BD-OC 102</NAME> 

     <F1> 
      <FID>124</FID> 
      <FNO>57</FNO>  
      <AID>126</AID> 
      <BID>125</BID> 
     </F1> 

     <F2> 
      <FID>125</FID> 
      <FNO>58</FNO> 
      <AID>127</AID> 
      <BID>128</BID> 
     </F2> 

    </Process> 

    <Process> 
     <ORDERNO>workorder124</ORDERNO> 
     <NAME>BD-OC 102</NAME> 
     <F1> 
      <FID>130</FID> 
      <FNO>59</FNO>  
      <AID>132</AID> 
      <BID>131</BID> 
     </F1> 
     <F2> 
      <FID>132</FID> 
      <FNO>60</FNO> 
      <AID>133</AID> 
      <BID>134</BID> 
     </F2> 

    </Process> 


</Response> 

참고 : 실제 파일이 훨씬 더 복잡 이보다 있지만 기본적인 개념은 동일하고, 하나의 (공통 부품)에 각 2 개 연속적인 블록을 병합.

도움/방향/포인터 감사합니다.

+0

어떤 xslt 버전? 병합의 규칙은 무엇입니까? ORDERNO가 동일하기 때문에 실제로 연속적입니까? –

+0

xslt 버전 1.0 규칙은 다음과 같습니다. 연속되는 요소 (2 개만)는 동일한 순서 번호를 갖습니다. (비록 내가 orderno를 기반으로하고 있다고 생각하는 것이 더 일반적 일 것이다) 그러나 그것이 내가 바라는 것 이상일 것이다. (더 나쁜 것은 아니다). – user1933888

답변

0

는 "2 개 연속 행을 병합"하기를이 시도 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:key name="kOrderno" match="ProcessResponse" use="ORDERNO" /> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()" > 
       <xsl:with-param name="ch" select="h1" /> 
      </xsl:apply-templates> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="ProcessResponse/ORDERNO"/> 
    <xsl:template match="ProcessResponse/NAME"/> 
    <xsl:template match="ProcessResponse/text()"/> 

    <xsl:template match="/*"> 
     <Response> 
      <xsl:for-each select="ProcessResponse"> 
       <xsl:if test="position() mod 2 = 1"> 
       <Process> 
        <xsl:copy-of select="ORDERNO"/> 
        <xsl:copy-of select="NAME"/> 
        <xsl:variable name="on" select="ORDERNO" /> 
        <xsl:element name="F1"> 
         <xsl:apply-templates /> 
        </xsl:element> 
        <xsl:element name="F2"> 
         <xsl:apply-templates select="following-sibling::ProcessResponse[1]/*" /> 
        </xsl:element> 
       </Process> 
       </xsl:if> 
      </xsl:for-each> 
     </Response> 
    </xsl:template> 
</xsl:stylesheet> 
+0

고마워, 그것은 매력처럼 작동했습니다. 귀하의 응답에서 취한 개념은 "위치() mod 2 = 1" 이고 "다음 형제"인데, 그 내용을 알고 있었기 때문에 주말에 내 노력을 저장했습니다. – user1933888

1

이 키 기반 솔루션 Using Keys to Group: The Muenchian Method보십시오 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:key name="kOrderno" match="ProcessResponse" use="ORDERNO" /> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()" > 
       <xsl:with-param name="ch" select="h1" /> 
      </xsl:apply-templates> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="ProcessResponse/ORDERNO"/> 
    <xsl:template match="ProcessResponse/NAME"/> 

    <xsl:template match="/*"> 
     <Response> 
      <xsl:for-each select="ProcessResponse[count(. | key('kOrderno', ORDERNO)[1]) =1] "> 
       <Process> 
        <xsl:copy-of select="ORDERNO"/> 
        <xsl:copy-of select="NAME"/> 
        <xsl:variable name="on" select="ORDERNO" /> 
        <xsl:for-each select=" key('kOrderno', $on)" > 
         <xsl:element name="F{position()}"> 
          <xsl:apply-templates ></xsl:apply-templates> 
         </xsl:element> 
        </xsl:for-each> 
       </Process> 
      </xsl:for-each> 
     </Response> 
    </xsl:template> 
</xsl:stylesheet> 

다음과 같은 출력을 생성합니다

<?xml version="1.0"?> 
<Response> 
    <Process> 
    <ORDERNO>workorder123</ORDERNO> 
    <NAME>BD-OC 102</NAME> 
    <F1> 


       <FID>124</FID> 
       <FNO>57</FNO> 
       <AID>126</AID> 
       <BID>125</BID> 

     </F1> 
    <F2> 


       <FID>125</FID> 
       <FNO>58</FNO> 
       <AID>127</AID> 
       <BID>128</BID> 

     </F2> 
    </Process> 
    <Process> 
    <ORDERNO>workorder124</ORDERNO> 
    <NAME>BD-OC 102</NAME> 
    <F1> 


       <FID>130</FID> 
       <FNO>59</FNO> 
       <AID>132</AID> 
       <BID>131</BID> 

     </F1> 
    <F2> 


       <FID>132</FID> 
       <FNO>60</FNO> 
       <AID>133</AID> 
       <BID>134</BID> 
     </F2> 
    </Process> 
</Response> 
+0

답변으로 많은 점을 알았을 때, 나는 심지어 xslt에 너무 많이 있다는 것을 알았습니다 (나는 자바 우물에 살고 있는데, 그것은 깊은 곳입니다). 그러나 요소를 그룹화하기 위해 orderNo를 사용하고 있습니다. 실제 xml은 일반적인 8 개 필드와 훨씬 더 복잡합니다 (xml을 공유 할 수 없으므로 적절하지 않을 수 있습니다). 그래서 내 최선의 방법은 2 연속 된 행을 병합하는 것입니다 (xml은 DB 행에서 'MUENCHIAN'방법으로 언급 한 것과 같습니다.) – user1933888

+0

Funy, 어떻게 당신의 코멘트를 해석 할 수 있겠습니까? "(필자는 orderno는 더 일반적 일 것입니다.)하지만 그것은 제가 찾고있는 것 이상입니다. (그 이상은 나쁜 것이 아닙니다.) * "orderno에 의한 분류는 당신이 찾고있는 것이 될 수 있습니다. 따라서 orderno는 단지 두 가지 요소들 –

+0

예, 여기 실제 XML이되는 포인트는 조합이 고유 한 약 8 개의 요소가 있습니다. 비슷한 조건을 시뮬레이트하기 위해 위의 더미 XML을 생성했습니다. 내가 생각할 수있는 그럴듯한 해결책은 2 연속 (from 그런 다음 xml로 변환되는 db는 항상 거의 공통적이지 않은 2 개의 레코드 만 반환합니다. (orderno, abc, xyz, message 등) 내 의견에 모호한 점이 있습니다 그리고 나는 당신의 대답을 업 그레 이드하고 싶었지만 그것을하기 위해 15 명의 담당자가 필요하다고 말하는 것을 허락하지 않았습니다. 귀하의 답변은 훌륭하지만 현재는 저에게 적합하지 않습니다. – user1933888

관련 문제