簡體   English   中英

XSLT 2.0合並2時間序列

[英]XSLT 2.0 Merge 2 timeseries

這是我的問題:我有2個時間序列的輸入。 一個在“ POS”標簽中,另一個在“ NEG”標簽中。值在“數量”屬性中。 所需的輸出是要確定凈額的兩個時間序列“ POS-Qty”-“ NEG-Qty”。

<DATUM>2014-04-24T22:00:00<POS><Period xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <TimeInterval v="2014-04-24T22:00Z/2014-04-25T22:00Z"/>
            <Resolution v="PT15M"/>
            <Interval>
                <Pos v="1"/>
                <Qty v="15"/>
            </Interval>
            <Interval>
                <Pos v="2"/>
                <Qty v="6"/>
            </Interval>
            <Interval>
                <Pos v="3"/>
                <Qty v="9"/>
            </Interval>
            <Interval>
                <Pos v="4"/>
                <Qty v="8"/>
            </Interval>
</Period></POS><NEG><Period xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <TimeInterval v="2014-04-24T22:00Z/2014-04-25T22:00Z"/>
            <Resolution v="PT15M"/>
            <Interval>
                <Pos v="1"/>
                <Qty v="23"/>
            </Interval>
            <Interval>
                <Pos v="2"/>
                <Qty v="80"/>
            </Interval>
            <Interval>
                <Pos v="3"/>
                <Qty v="59"/>
            </Interval>
            <Interval>
                <Pos v="4"/>
                <Qty v="2"/>
            </Interval>
</Period></NEG></DATUM>

我試着玩這樣的事情:

    <?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:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:formatter="com.inubit.ibis.xsltext.Formatter" exclude-result-prefixes="#all" version="2.0">
      <xsl:output method="xml" encoding="UTF-8"/>
      <xsl:template match="/"><DATA><xsl:for-each select="/DATUM/POS/Period/Interval"><xsl:value-of select="xs:integer(/DATUM/POS/Period/Interval/Qty/@v) - xs:integer(/DATUM/NEG/Period/Interval/Qty/@v)"/></xsl:for-each></DATA>
      </xsl:template>
    </xsl:stylesheet>

當然,這是行不通的-但我不知道該怎么做。

輸出應如下所示:

<?xml version="1.0" encoding="UTF-8"?> 
<DATUM>2014-04-24T22:00:00
  <NET>
    <Period xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance>
      <TimeInterval v="2014-04-24T22:00Z/2014-04-25T22:00Z"/> 
        <Resolution v="PT15M"/> 
          <Interval> 
           <Pos v="1"/> 
           <Qty v="-8"/> 
             </Interval> 
          <Interval> 
           <Pos v="2"/> 
           <Qty v="-74"/> 
             </Interval> 
          <Interval> 
           <Pos v="3"/> 
           <Qty v="-50"/>
             <Interval> 
           <Pos v="4"/> 
           <Qty v="6"/> 
             </Interval>
 </NET>
</DATUM>

請注意:在“ NEG”和“ POS”中有96個“間隔”元素-我將其切為4,以便於閱讀。

謝謝!

Saxon 9.8所有版本或Altova 2017和2018支持的XSLT 3都有xsl:merge指令,您可以使用:

<?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"
    exclude-result-prefixes="xs math"
    version="3.0">

    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>

    <xsl:mode on-no-match="shallow-copy"/>

    <xsl:template match="POS">
        <NET>
            <xsl:apply-templates/>
        </NET>
    </xsl:template>

    <xsl:template match="POS/Period">
        <xsl:copy>
            <xsl:apply-templates select="@*, * except Interval"/>
            <xsl:merge>
                <xsl:merge-source for-each-item="., ../following-sibling::NEG[1]/Period"
                    select="Interval">
                    <xsl:merge-key select="Pos/@v"/>
                </xsl:merge-source>
                <xsl:merge-action>
                    <xsl:copy>
                        <xsl:copy-of select="Pos"/>
                        <Qty v="{current-merge-group()[1]/Qty/@v - current-merge-group()[2]/Qty/@v}"/>
                    </xsl:copy>
                </xsl:merge-action>
            </xsl:merge>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="NEG"/>

</xsl:stylesheet>

結果是

<DATUM>2014-04-24T22:00:00<NET>
      <Period xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         <TimeInterval v="2014-04-24T22:00Z/2014-04-25T22:00Z"/>
         <Resolution v="PT15M"/>
         <Interval>
            <Pos v="1"/>
            <Qty v="-8"/>
         </Interval>
         <Interval>
            <Pos v="2"/>
            <Qty v="-74"/>
         </Interval>
         <Interval>
            <Pos v="3"/>
            <Qty v="-50"/>
         </Interval>
         <Interval>
            <Pos v="4"/>
            <Qty v="6"/>
         </Interval>
      </Period>
   </NET>
</DATUM>

使用XSLT 2,您可以使用一個鍵找到另一個值並將其減去:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>

    <xsl:key name="pos" match="DATUM/NEG/Period/Interval" use="Pos/@v"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="POS">
        <NET>
            <xsl:apply-templates/>
        </NET>
    </xsl:template>

    <xsl:template match="Interval/Qty/@v">
        <xsl:attribute name="{name()}" select=". - key('pos', ../../Pos/@v, ancestor::DATUM)/Qty/@v"/>
    </xsl:template>

    <xsl:template match="NEG"/>

</xsl:stylesheet>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM