[英]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.