【发布时间】:2017-09-10 07:53:39
【问题描述】:
我是 XSLT 转换的新手,并且具有非常基础的知识。 我正在寻找你的帮助。我有一个 XML 文件,请参阅下面的示例。我想将此文件拆分为多个较小的文件。
我想根据 cmfp:future 和 cmfp:quotation 的值进行分组。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<GuiRoot xmlns:cmfp="mx.MarketParameters.Fixing.Commodities.Futures" xmlns:mp="mx.MarketParameters" xmlns:fg="mx.MarketParameters.Fixing" xmlns:fgrt="mx.MarketParameters.Fixing.IRIndices" xmlns:xc="xmlCache" xmlns:fgfx="mx.MarketParameters.Fixing.FXIndices" xmlns:cmip="mx.MarketParameters.Commodities.Indices">
<xc:XmlCache xc:action="Update">
<xc:XmlCacheArea xc:value="MarketParameters">
<mp:nickName xc:subset="Reference" xc:value="./BORATES">
<mp:date xc:value="20161202">
<fg:fixing>
<cmfp:futurePrice>
<cmfp:future xc:value="ONE">
<cmfp:quotation xc:value="1.1">
<cmfp:maturity xc:value="1.1.1">
<cmfp:column xc:value="CLOSE" xc:type="Fields">
<mp:HisValue xc:keyFormat="C">[startDate="19990101"][endDate="19990101"]13405.00</mp:HisValue>
</cmfp:column>
</cmfp:maturity>
</cmfp:quotation>
</cmfp:future>
<cmfp:future xc:value="ONE">
<cmfp:quotation xc:value="1.2">
<cmfp:maturity xc:value="1.2.1">
<cmfp:column xc:value="CLOSE" xc:type="Fields">
<mp:HisValue xc:keyFormat="C">[startDate="19990101"][endDate="19990101"]13405.00</mp:HisValue>
</cmfp:column>
</cmfp:maturity>
</cmfp:quotation>
<cmfp:quotation xc:value="1.2">
<cmfp:maturity xc:value="1.2.2">
<cmfp:column xc:value="CLOSE" xc:type="Fields">
<mp:HisValue xc:keyFormat="C">[startDate="19990101"][endDate="19990101"]13406.00</mp:HisValue>
</cmfp:column>
</cmfp:maturity>
</cmfp:quotation>
</cmfp:future>
<cmfp:future xc:value="TWO">
<cmfp:quotation xc:value="2.1">
<cmfp:maturity xc:value="2.1.1">
<cmfp:column xc:value="CLOSE" xc:type="Fields">
<mp:HisValue xc:keyFormat="C">[startDate="19990101"][endDate="19990101"]13405.00</mp:HisValue>
</cmfp:column>
</cmfp:maturity>
</cmfp:quotation>
</cmfp:future>
<cmfp:future xc:value="THREE">
<cmfp:quotation xc:value="3.1">
<cmfp:maturity xc:value="3.1.1">
<cmfp:column xc:value="CLOSE" xc:type="Fields">
<mp:HisValue xc:keyFormat="C">[startDate="19990101"][endDate="19990101"]13405.00</mp:HisValue>
</cmfp:column>
</cmfp:maturity>
</cmfp:quotation>
</cmfp:future>
<cmfp:future xc:value="FOUR">
<cmfp:quotation xc:value="4.1">
<cmfp:maturity xc:value="4.1.1">
<cmfp:column xc:value="CLOSE" xc:type="Fields">
<mp:HisValue xc:keyFormat="C">[startDate="19990101"][endDate="19990101"]13405.00</mp:HisValue>
</cmfp:column>
</cmfp:maturity>
</cmfp:quotation>
</cmfp:future>
<cmfp:future xc:value="EIGHT">
<cmfp:quotation xc:value="8.1">
<cmfp:maturity xc:value="8.1.1">
<cmfp:column xc:value="CLOSE" xc:type="Fields">
<mp:HisValue xc:keyFormat="C">[startDate="19990101"][endDate="19990101"]13405.00</mp:HisValue>
</cmfp:column>
</cmfp:maturity>
</cmfp:quotation>
</cmfp:future>
</cmfp:futurePrice>
</fg:fixing>
</mp:date>
</mp:nickName>
</xc:XmlCacheArea>
</xc:XmlCache>
</GuiRoot>
所需的输出 文件1
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<GuiRoot xmlns:cmfp="mx.MarketParameters.Fixing.Commodities.Futures" xmlns:mp="mx.MarketParameters" xmlns:fg="mx.MarketParameters.Fixing" xmlns:fgrt="mx.MarketParameters.Fixing.IRIndices" xmlns:xc="xmlCache" xmlns:fgfx="mx.MarketParameters.Fixing.FXIndices" xmlns:cmip="mx.MarketParameters.Commodities.Indices">
<xc:XmlCache xc:action="Update">
<xc:XmlCacheArea xc:value="MarketParameters">
<mp:nickName xc:subset="Reference" xc:value="./BORATES">
<mp:date xc:value="20161202">
<fg:fixing>
<cmfp:futurePrice>
<cmfp:future xc:value="ONE">
<cmfp:quotation xc:value="1.1">
<cmfp:maturity xc:value="1.1.1">
<cmfp:column xc:value="CLOSE" xc:type="Fields">
<mp:HisValue xc:keyFormat="C">[startDate="19990101"][endDate="19990101"]13405.00</mp:HisValue>
</cmfp:column>
</cmfp:maturity>
</cmfp:quotation>
<cmfp:quotation xc:value="1.2">
<cmfp:maturity xc:value="1.2.1">
<cmfp:column xc:value="CLOSE" xc:type="Fields">
<mp:HisValue xc:keyFormat="C">[startDate="19990101"][endDate="19990101"]13405.00</mp:HisValue>
</cmfp:column>
</cmfp:maturity>
<cmfp:maturity xc:value="1.2.2">
<cmfp:column xc:value="CLOSE" xc:type="Fields">
<mp:HisValue xc:keyFormat="C">[startDate="19990101"][endDate="19990101"]13406.00</mp:HisValue>
</cmfp:column>
</cmfp:maturity>
</cmfp:quotation>
</cmfp:future>
<cmfp:future xc:value="FOUR">
<cmfp:quotation xc:value="4.1">
<cmfp:maturity xc:value="4.1.1">
<cmfp:column xc:value="CLOSE" xc:type="Fields">
<mp:HisValue xc:keyFormat="C">[startDate="19990101"][endDate="19990101"]13405.00</mp:HisValue>
</cmfp:column>
</cmfp:maturity>
</cmfp:quotation>
</cmfp:future>
</cmfp:futurePrice>
</fg:fixing>
</mp:date>
</mp:nickName>
</xc:XmlCacheArea>
</xc:XmlCache>
</GuiRoot>
文件2 类似于文件 1,但基于 mod 结果的不同节点.....
文件3 类似于文件 1,但基于 mod 结果的不同节点.....
感谢您的帮助...在此先感谢
我尝试使用下面的 XSLT 代码,但它没有给我想要的输出......
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:cmfp="mx.MarketParameters.Fixing.Commodities.Futures" xmlns:mp="mx.MarketParameters" xmlns:fg="mx.MarketParameters.Fixing" xmlns:fgrt="mx.MarketParameters.Fixing.IRIndices" xmlns:xc="xmlCache" xmlns:fgfx="mx.MarketParameters.Fixing.FXIndices" xmlns:cmip="mx.MarketParameters.Commodities.Indices" exclude-result-prefixes="cmfp mp fg fgrt xc fgfx cmip">
<xsl:output method="xml" version="1.0" omit-xml-declaration="no" standalone="yes" encoding="UTF-8" indent="yes"/>
<!-- define variables [start] -->
<xsl:variable name="action" select="/GuiRoot/xc:XmlCache/@xc:action"/>
<xsl:variable name="nickname" select="/GuiRoot/xc:XmlCache/xc:XmlCacheArea/mp:nickName/@xc:value"/>
<xsl:variable name="mpdate" select="/GuiRoot/xc:XmlCache/xc:XmlCacheArea/mp:nickName/mp:date/@xc:value"/>
<xsl:variable name="noOfSplits" select="3"/>
<!-- define variables [ end ]-->
<xsl:template match="cmfp:futurePrice">
<xsl:apply-templates select="cmfp:futurePrice"/>
<xsl:for-each-group select="cmfp:future" group-by="(position() -1) mod $noOfSplits">
<xsl:variable name="file_name" select="format-number(current-grouping-key(),'000')"/>
<xsl:result-document href="files/cmfp_SPLIT_{$file_name}.xml">
<GuiRoot xmlns:cmfp="mx.MarketParameters.Fixing.Commodities.Futures" xmlns:mp="mx.MarketParameters" xmlns:fg="mx.MarketParameters.Fixing" xmlns:fgrt="mx.MarketParameters.Fixing.IRIndices" xmlns:xc="xmlCache" xmlns:fgfx="mx.MarketParameters.Fixing.FXIndices" xmlns:cmip="mx.MarketParameters.Commodities.Indices">
<xc:XmlCache>
<xsl:attribute name="xc:action">
<xsl:value-of select="$action"/>
</xsl:attribute>
<xc:XmlCacheArea xc:value="MarketParameters">
<mp:nickName xc:subset="Reference">
<xsl:attribute name="xc:value">
<xsl:value-of select="$nickname"/>
</xsl:attribute>
<mp:date>
<xsl:attribute name="xc:value">
<xsl:value-of select="$mpdate"/>
</xsl:attribute>
<fg:fixing>
<cmfp:futurePrice>
<xsl:copy-of select="current-group()"/>
</cmfp:futurePrice>
</fg:fixing>
</mp:date>
</mp:nickName>
</xc:XmlCacheArea>
</xc:XmlCache>
</GuiRoot>
</xsl:result-document>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
【问题讨论】:
-
您能否详细解释一下拆分的标准是什么?为什么第一个结果文件有
cmfp:future xc:value="ONE"和cmfp:future xc:value="FOUR",但是TWO和THREE值有两个不同的文件? -
谢谢马丁。我刚刚意识到我输入了错误的输入文件。基本上我需要根据 cmfp:future 和 cmfp:quotation 进行分组。我使用了基于节点位置的简单 mod 函数......
-
在示例中 uniq cmfp:future 是一、二、三、四和八,即总共 5 个 uniq 值。如果我选择 mod 功能一和四将在同一个文件中。两个和八个在同一个文件中,三个将在单独的文件中。希望它澄清。再次感谢您!