我正在努力解决数据转换问题,并将非常感谢您的帮助和建议。
我想将一个相当大的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>发布于 2016-07-21 12:31:45
你的问题还不完全清楚。特别是关于“条件格式”的部分-我在你的描述中没有看到任何条件。
FWIW,以下样式表:
XSLT1.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>这与你的预期结果是完全相同的--无论是出于设计,还是出于巧合。
https://stackoverflow.com/questions/38497190
复制相似问题