2017-11-09 9 views
0

내 MxML 파일을 그룹화하고 분할하는 데 도움이되는 정보를 찾고 있습니다.result-document를 사용하여 xml 파일을 그룹화하고 작업하지 않음

다음은 여러 개의 청크로 그룹화하고 분할하려는 내 샘플 XML입니다. 내 MxML 파일에 여러 개의 ccy 쌍과 성숙도 집합이 있습니다. 파일을 전체적으로 처리 할 때 시간이 걸리므로 아이디어는 쌍으로 그룹화되며 파일을 여러 개의 작은 chuk으로 분할합니다 (구성 가능).

데이터 파일 ... XML

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:math="http://www.w3.org/2005/xpath-functions/math" 
xmlns:fxsm="mx.MarketParameters.Forex.Smile" 
xpath-default-namespace="mx.MarketParameters.Forex.Smile" xmlns:xc="xmlCache" exclude-result-prefixes="xs math" version="2.0"> 
    <xsl:output method="xml" version="1.0" omit-xml-declaration="no" encoding="UTF-8" indent="yes"/> 
    <!-- <xsl:mode on-no-match="shallow-copy"/> --> 
    <xsl:strip-space elements="*"/> 
    <!-- define variables [start] --> 
    <xsl:variable name="noOfSplits" select="3"/> 
    <!-- define variables [end] --> 
    <!--- an alternative to shallow-copy in xslt 2.0 --> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <!--- an alternative to shallow-copy in xslt 2.0 --> 
    <xsl:template match="/"> 
     <xsl:variable name="original-root-element" select="*"/> 
     <xsl:variable name="groups"> 
     <xsl:for-each-group select="//pair" group-by="@xc:value"> 
      <xsl:copy> 
       <xsl:copy-of select="@*"/> 
       <xsl:for-each-group select="current-group()/maturity" group-by="@xc:value"> 
        <xsl:copy> 
        <xsl:copy-of select="@*, current-group()/node()"/> 
        </xsl:copy> 
       </xsl:for-each-group> 
      </xsl:copy> 
     </xsl:for-each-group> 
     </xsl:variable> 
     <xsl:for-each-group select="$groups/pair" group-by="(position() - 1) mod $noOfSplits"> 
     <xsl:result-document href="files/split{position()}.xml"> 
      <xsl:apply-templates select="$original-root-element"> 
       <xsl:with-param name="contents" select="current-group()" tunnel="yes"/> 
      </xsl:apply-templates> 
     </xsl:result-document> 
     </xsl:for-each-group> 
    </xsl:template> 
    <xsl:template match="//smile"> 
     <xsl:param name="contents" tunnel="yes"/> 
     <xsl:copy> 
     <xsl:copy-of select="$contents"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

가 친절 위의 코드에 어떤 문제가 있는지 이해하는 데 도움을 appriciate (작동하지 않는)

<?xml version="1.0"?> 
<GuiRoot> 
    <xc:XmlCache xmlns:xc="XmlCache" xc:action="Update"> 
     <xc:XmlCacheArea xc:value="MarketParameters"> 
      <mp:nickName xmlns:mp="mx.MarketParameters" xc:value="./BORATES" xc:subset="Reference"> 
       <mp:date xc:value="TODAY"> 
        <fx:forex xmlns:fx="mx.MarketParameters.Forex"> 
         <fxsm:smile xmlns:fxsm="mx.MarketParameters.Forex.Smile"> 
          <fxsm:pair xc:value="pair1"> 
           <fxsm:maturity xc:value="10Y"> 
            <fxsm:ordinate xc:type="Fields" xc:value="10.000000000"> 
             <mp:bid xc:type="Field" xc:keyFormat="N">0.9236</mp:bid> 
             <mp:ask xc:type="Field" xc:keyFormat="N">0.9236</mp:ask> 
            </fxsm:ordinate> 
           </fxsm:maturity> 
           <fxsm:maturity xc:value="1Y"> 
            <fxsm:ordinate xc:type="Fields" xc:value="90.000000000"> 
             <mp:bid xc:type="Field" xc:keyFormat="N">3.4369</mp:bid> 
             <mp:ask xc:type="Field" xc:keyFormat="N">3.4369</mp:ask> 
            </fxsm:ordinate> 
           </fxsm:maturity> 
          </fxsm:pair> 
          <fxsm:pair xc:value="pair2"> 
           <fxsm:maturity xc:value="10Y"> 
            <fxsm:ordinate xc:type="Fields" xc:value="10.000000000"> 
             <mp:bid xc:type="Field" xc:keyFormat="N">3.4369</mp:bid> 
             <mp:ask xc:type="Field" xc:keyFormat="N">3.4369</mp:ask> 
            </fxsm:ordinate> 
           </fxsm:maturity> 
           <fxsm:maturity xc:value="1Y"> 
            <fxsm:ordinate xc:type="Fields" xc:value="90.000000000"> 
             <mp:bid xc:type="Field" xc:keyFormat="N">3.4369</mp:bid> 
             <mp:ask xc:type="Field" xc:keyFormat="N">3.4369</mp:ask> 
            </fxsm:ordinate> 
           </fxsm:maturity> 
          </fxsm:pair> 
          <fxsm:pair xc:value="pair3"> 
           <fxsm:maturity xc:value="10Y"> 
            <fxsm:ordinate xc:type="Fields" xc:value="10.000000000"> 
             <mp:bid xc:type="Field" xc:keyFormat="N">3.4369</mp:bid> 
             <mp:ask xc:type="Field" xc:keyFormat="N">3.4369</mp:ask> 
            </fxsm:ordinate> 
           </fxsm:maturity> 
           <fxsm:maturity xc:value="1Y"> 
            <fxsm:ordinate xc:type="Fields" xc:value="90.000000000"> 
             <mp:bid xc:type="Field" xc:keyFormat="N">3.4369</mp:bid> 
             <mp:ask xc:type="Field" xc:keyFormat="N">3.4369</mp:ask> 
            </fxsm:ordinate> 
           </fxsm:maturity> 
          </fxsm:pair> 
          <fxsm:pair xc:value="pair4"> 
           <fxsm:maturity xc:value="10Y"> 
            <fxsm:ordinate xc:type="Fields" xc:value="10.000000000"> 
             <mp:bid xc:type="Field" xc:keyFormat="N">3.4369</mp:bid> 
             <mp:ask xc:type="Field" xc:keyFormat="N">3.4369</mp:ask> 
            </fxsm:ordinate> 
           </fxsm:maturity> 
           <fxsm:maturity xc:value="1Y"> 
            <fxsm:ordinate xc:type="Fields" xc:value="90.000000000"> 
             <mp:bid xc:type="Field" xc:keyFormat="N">3.4369</mp:bid> 
             <mp:ask xc:type="Field" xc:keyFormat="N">3.4369</mp:ask> 
            </fxsm:ordinate> 
           </fxsm:maturity> 
          </fxsm:pair> 
         </fxsm:smile> 
        </fx:forex> 
       </mp:date> 
      </mp:nickName> 
     </xc:XmlCacheArea> 
    </xc:XmlCache> 
</GuiRoot> 

내 XSLT ....

미리 감사드립니다.

+0

음, 문제를 설명하는 데 필요한 최소 데이터까지 입력을 줄여야하고 입력에 필요한 결과를 표시해야합니다.단순히 XSLT가 "작동하지 않는다"고 말하면 단순히 원하는 결과와 다양한 요소를 그룹화하려는 XSLT를 작성하거나 복사 한 이유를 설명하지 못합니다. 또한 색슨 (Saxon)을 언급하고 파일을 분할하려는 경우 Saxon 9.8 및 XSLT 3을 사용하면 작업을 쉽게 수행 할 수 있습니다. http://xslt-3-by-example.blogspot.de/2017/06/extracting-sub- trees-of-document-using.html –

+0

"작동하지 않습니다"라고 말하지 마십시오. 우리는 그것이 어떻게 실패했는지 알아야합니다. –

+0

안녕하세요 마틴, 답장을 주셔서 감사합니다 .... – PanduranG

답변

1

답을 제공하는 것보다 m 디버깅 과정 : 잘하면 더 유익 할 것입니다.

먼저 -t 옵션을 사용하여 명령 줄에서 변환을 실행했습니다. XML 선언 이외에 콘솔에서 출력을 생성하지 않았고 -t 출력에 2 차 출력 파일이 기록되지 않았습니다.

그런 다음 -T 옵션을 사용하여 실행했습니다 (흔히 대량의 추적 출력을 생성 함). 이번에는 매우 짧은 추적 파일을 생성했습니다 :

<trace saxon-version="9.8.0.6" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<source node="/" line="0" file="test.xml"> 
    <xsl:template match="/" line="20" column="29" module="test.xsl"> 
    <xsl:variable name="original-root-element" line="21" column="64" module="test.xsl"> 
    <xsl:variable name="groups" line="22" column="37" module="test.xsl"> 
    <xsl:for-each-group line="23" column="70" module="test.xsl"> 
    </xsl:for-each-group> 
    <xsl:for-each-group line="34" column="95" module="test.xsl"> 
    </xsl:for-each-group> 
    </xsl:variable> 
    </xsl:variable> 
    </xsl:template> 
</source><!--/--> 
</trace> 

이는 23 번째 줄의 xsl : for-each-group이 아무것도 선택하지 않음을 나타냅니다. 변수 $ groups의 값을 표시하는 xsl : 메시지로 확인했습니다.

아무런 차이가없는 명시 적으로 (select="//Q{mx.MarketParameters.Forex.Smile}pair") 네임 스페이스를 사용하도록 select 표현식을 변경해 보았습니다.

그런 다음 oXygen에서 동일한 XPath 표현 //Q{mx.MarketParameters.Forex.Smile}pair을 시도한 다음 4 개의 pair 요소를 선택했습니다.

나는 아직 운이 없다. //*:pair.//*:pair.//*:smile/*을 시도했다.

for-each-group 앞에 <xsl:message select=".//*:pair"/>을 추가하고 4 개의 pair 요소를 출력합니다.

아하! for-each-group은 빈 출력을 생성 할 수있는 또 다른 이유가 있습니다. 즉, 요소를 선택하지만 그룹화 키가 없습니다. 그룹화 키는 소스 문서에 존재하는 것으로 보이는 @xc : value입니다. 그러나 더 자세히 살펴보면 소스 문서는 xmlns:xc="XmlCache"이고 스타일 시트는 xmlns:xc="xmlCache"입니다.

간단한 오류입니다. 이 실습이 보여 주듯이, 이것들은 단단히 고정시킬 수 없습니다. 이것에 대한 진정한 해답은 스키마 인식 XSLT 코딩을 사용하는 것입니다. 이것은 아마도 XSLT 컴파일러가 오류를 발견하는 것을 허용했을 것입니다. 안타깝게도, 사람들이 깨달은 유일한 시간은 그러한 문제를 디버깅하는 데 몇 시간을 소비했을 때였고 그 시점에서 그들은 다시 일어나지 않도록 시간을 투자하기에는 너무 많은 시간을 보냈습니다.

+0

덕분에 많은 마이클로 파일/split1.xml 및 pair2에있는 것으로, 이것은 매우 유용 것으로 예상된다. 그러나 내 xslt를 변경 한 후 ... xmlns : xc = "XmlCache", 여전히 파일을 생성하지 못했습니다 ... – PanduranG

+0

@PanduranG, 당신이 수정 한 내용으로 게시 한 스타일 시트를 시도했습니다. Saxon 9와'-t' 옵션을 사용하면 결과 파일'files/split1.xml','files/split2.xml','files/split3.xml'을 쓰는 것을 볼 수 있습니다. –

+0

@MartinHonnen, saxon-he-9.4.0.7.jar를 사용하고 있습니다. 동일하게 사용 했습니까? 수정 한 내용이 줄 아래에만 적용 되었습니까? PanduranG