2016-07-21 5 views
0

데이터 변환 문제로 어려움을 겪고 있으며 도움과 조언에 진심으로 감사드립니다.조건부 XML to XML 변환

상당히 큰 xml 파일을 다른 xml 형식으로 변환하고 싶습니다. 제 동료들은 XSLT를 사용하면 문제가 해결되지만, 언뜻보기에는 XSLT가 필요한 조건부 서식을 수행 할 수 없다는 사실을 알게되었습니다. 내 XML에서 볼 수 있듯이 시작 및 종료 태그에 설명 된 지정된 시간 간격에서 여러 timeseries 포인트를 파생해야합니다.

그런 질문에 대한 나의 질문은 무엇입니까? XSLT를 사용하거나 다른 기술을 사용하면 쉽게 해결할 수 있습니까? 아니면 사용자 정의 코드 작성이 가장 잘 처리됩니까?

답장을 기다리십시오.

감사합니다.

XML을 변환 할 수 있습니다 :

<starttime> 
    <datetime>201605130500</datetime> 
    <qualifier>163</Qualifier> 
</starttime> 
<endtime> 
    <datetime>201605150500</datetime> 
    <qualifier>164</Qualifier> 
</endtime> 
<seriesPeriod> 
    <quantityDetails> 
     <quantity>8.0</quantity> 
     <qualifier>135</qualifier> 
    </quantityDetails> 
    <datetimeDetails> 
     <datetime>201605130500201605130600</datetime> <!-- This is a period to from 05:00 to 06:00 (from-to YYYYMMDDHHH-YYYYMMDDHHH) --> 
     <qualifier>324</qualifier> 
    </datetimeDetails> 
</seriesPeriod> 
<seriesPeriod> 
    <quantityDetails> 
     <quantity>-11</quantity> 
     <qualifier>135</qualifier> 
    </quantityDetails> 
    <datetimeDetails> 
     <dateTime>201605130600201605130700</dateTime> 
     <qualifier>324</qualifier> 
    </datetimeDetails> 
</seriesPeriod> 
<!-- Continues with a total of 48 similar "seriesPeriod", one point for each hour in the timeinterval derived from starttime and endtime --> 

예상 결과 변환 후 :

<timeseries> 
    <timeinterval> 
     <start>2016-05-13T05:00Z</start> 
     <end>2016-05-15T05:00Z</end> 
    </timeinterval> 
    <point> 
     <position>1</position> 
     <quantity>8</quantity> 
    </point> 
    <point> 
     <position>2</position> 
     <quantity>-11</quantity> 
    </point> 
    <!-- Continues with a total of 48 similar "points", one point for each hour in the timeinterval --> 
</timeseries> 
+0

여기서는 XSLT가 좋은 도구 일 수 있지만 필요한 변환의 논리를 설명해야합니다. 특히 'quantity'값은 예상 결과에서 비롯된 것입니다. 감사합니다. –

+0

로직에 대한 설명과 함께보다 포괄적 인 (잘 구성된!) 예제가 유용 할 것입니다. 또한 XSLT 2.0을 사용할 수 있는지 나타냅니다. –

+0

첫 번째 점에서 "4"의 양과 두 번째 점에서 "-11"의 양을 계산하는 방법을 명확히하십시오. –

답변

0

귀하의 질문은 완전히 명확하지 않다. 특히 "조건부 서식"에 대한 부분 - 설명에 어떤 조건도 표시되지 않습니다.

FWIW 다음 스타일 :

XSLT 다음 잘 형성된 입력에인가 1.0

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

<xsl:template match="/root"> 
    <timeseries> 
     <timeinterval> 
      <start> 
       <xsl:call-template name="format-as-date"> 
        <xsl:with-param name="string" select="starttime/datetime"/> 
       </xsl:call-template> 
      </start> 
      <end> 
       <xsl:call-template name="format-as-date"> 
        <xsl:with-param name="string" select="endtime/datetime"/> 
       </xsl:call-template> 
      </end> 
     </timeinterval> 
     <xsl:for-each select="seriesPeriod"> 
      <point> 
       <position> 
        <xsl:value-of select="position()"/> 
       </position> 
       <quantity> 
        <xsl:value-of select="number(quantityDetails/quantity)"/> 
       </quantity> 
      </point> 
     </xsl:for-each> 
    </timeseries> 
</xsl:template> 

<xsl:template name="format-as-date"> 
    <xsl:param name="string"/> 
    <xsl:value-of select="substring($string, 1, 4)"/> 
    <xsl:text>-</xsl:text> 
    <xsl:value-of select="substring($string, 5, 2)"/> 
    <xsl:text>-</xsl:text> 
    <xsl:value-of select="substring($string, 7, 2)"/> 
    <xsl:text>T</xsl:text> 
    <xsl:value-of select="substring($string, 9, 2)"/> 
    <xsl:text>:</xsl:text> 
    <xsl:value-of select="substring($string, 11, 2)"/> 
    <xsl:text>Z</xsl:text> 
</xsl:template> 

</xsl:stylesheet> 

(!)

XML

<root> 
    <starttime> 
    <datetime>201605130500</datetime> 
    <qualifier>163</qualifier> 
    </starttime> 
    <endtime> 
    <datetime>201605150500</datetime> 
    <qualifier>164</qualifier> 
    </endtime> 
    <seriesPeriod> 
    <quantityDetails> 
     <quantity>8.0</quantity> 
     <qualifier>135</qualifier> 
    </quantityDetails> 
    <datetimeDetails> 
     <datetime>201605130500201605130600</datetime> 
     <qualifier>324</qualifier> 
    </datetimeDetails> 
    </seriesPeriod> 
    <seriesPeriod> 
    <quantityDetails> 
     <quantity>-11</quantity> 
     <qualifier>135</qualifier> 
    </quantityDetails> 
    <datetimeDetails> 
     <dateTime>201605130600201605130700</dateTime> 
     <qualifier>324</qualifier> 
    </datetimeDetails> 
    </seriesPeriod> 
</root> 

반환합니다 : 당신의 예상 된 결과와 동일합니다

결과

<?xml version="1.0" encoding="UTF-8"?> 
<timeseries> 
    <timeinterval> 
     <start>2016-05-13T05:00Z</start> 
     <end>2016-05-15T05:00Z</end> 
    </timeinterval> 
    <point> 
     <position>1</position> 
     <quantity>8</quantity> 
    </point> 
    <point> 
     <position>2</position> 
     <quantity>-11</quantity> 
    </point> 
</timeseries> 

- 중 디자인에 의해, 또는 우연에 의해.

+0

Michael 대단히 고마워! XSLT에 익숙하지 않아서 제 학습에 많은 도움이되었습니다. 조건부 서식 지정이 의미하는 바는 'value-of select = "position()'을 알지 못해서 시작 및 종료 시점에서 위치 번호 매기기를 파생시켜야한다고 생각했기 때문입니다. – jstensen

+0

"* 나는 시작과 끝에서 위치 번호 매기기를 얻어야한다고 생각했다." "재미있는"문제 였을 것이다. –