【发布时间】:2017-11-09 07:32:18
【问题描述】:
我正在寻求您对我的 Mxml 文件进行分组和拆分的帮助。
下面是我的示例 XML,我想在其中分组并拆分为多个块。 我的 Mxml 文件有多个 ccy 对和成熟度集。当我将文件作为一个整体处理时,它需要一些时间,所以想法是成对分组并将文件分成多个较小的 chuk(这将是可配置的)。
数据文件...xml
<?xml version="1.0"?>
<GuiRoot>
<xc:XmlCache xmlns:xc="XmlCache" xc:action="Update">
<xc:XmlCacheArea xc:value="MarketParameters">
<mp:nickName xmlns:mp="mx.MarketParameters" xc:value="./BORATES" xc:subset="Reference">
<mp:date xc:value="TODAY">
<fx:forex xmlns:fx="mx.MarketParameters.Forex">
<fxsm:smile xmlns:fxsm="mx.MarketParameters.Forex.Smile">
<fxsm:pair xc:value="pair1">
<fxsm:maturity xc:value="10Y">
<fxsm:ordinate xc:type="Fields" xc:value="10.000000000">
<mp:bid xc:type="Field" xc:keyFormat="N">0.9236</mp:bid>
<mp:ask xc:type="Field" xc:keyFormat="N">0.9236</mp:ask>
</fxsm:ordinate>
</fxsm:maturity>
<fxsm:maturity xc:value="1Y">
<fxsm:ordinate xc:type="Fields" xc:value="90.000000000">
<mp:bid xc:type="Field" xc:keyFormat="N">3.4369</mp:bid>
<mp:ask xc:type="Field" xc:keyFormat="N">3.4369</mp:ask>
</fxsm:ordinate>
</fxsm:maturity>
</fxsm:pair>
<fxsm:pair xc:value="pair2">
<fxsm:maturity xc:value="10Y">
<fxsm:ordinate xc:type="Fields" xc:value="10.000000000">
<mp:bid xc:type="Field" xc:keyFormat="N">3.4369</mp:bid>
<mp:ask xc:type="Field" xc:keyFormat="N">3.4369</mp:ask>
</fxsm:ordinate>
</fxsm:maturity>
<fxsm:maturity xc:value="1Y">
<fxsm:ordinate xc:type="Fields" xc:value="90.000000000">
<mp:bid xc:type="Field" xc:keyFormat="N">3.4369</mp:bid>
<mp:ask xc:type="Field" xc:keyFormat="N">3.4369</mp:ask>
</fxsm:ordinate>
</fxsm:maturity>
</fxsm:pair>
<fxsm:pair xc:value="pair3">
<fxsm:maturity xc:value="10Y">
<fxsm:ordinate xc:type="Fields" xc:value="10.000000000">
<mp:bid xc:type="Field" xc:keyFormat="N">3.4369</mp:bid>
<mp:ask xc:type="Field" xc:keyFormat="N">3.4369</mp:ask>
</fxsm:ordinate>
</fxsm:maturity>
<fxsm:maturity xc:value="1Y">
<fxsm:ordinate xc:type="Fields" xc:value="90.000000000">
<mp:bid xc:type="Field" xc:keyFormat="N">3.4369</mp:bid>
<mp:ask xc:type="Field" xc:keyFormat="N">3.4369</mp:ask>
</fxsm:ordinate>
</fxsm:maturity>
</fxsm:pair>
<fxsm:pair xc:value="pair4">
<fxsm:maturity xc:value="10Y">
<fxsm:ordinate xc:type="Fields" xc:value="10.000000000">
<mp:bid xc:type="Field" xc:keyFormat="N">3.4369</mp:bid>
<mp:ask xc:type="Field" xc:keyFormat="N">3.4369</mp:ask>
</fxsm:ordinate>
</fxsm:maturity>
<fxsm:maturity xc:value="1Y">
<fxsm:ordinate xc:type="Fields" xc:value="90.000000000">
<mp:bid xc:type="Field" xc:keyFormat="N">3.4369</mp:bid>
<mp:ask xc:type="Field" xc:keyFormat="N">3.4369</mp:ask>
</fxsm:ordinate>
</fxsm:maturity>
</fxsm:pair>
</fxsm:smile>
</fx:forex>
</mp:date>
</mp:nickName>
</xc:XmlCacheArea>
</xc:XmlCache>
</GuiRoot>
我的 XSLT(不工作)
<?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"
xmlns:fxsm="mx.MarketParameters.Forex.Smile"
xpath-default-namespace="mx.MarketParameters.Forex.Smile" xmlns:xc="xmlCache" exclude-result-prefixes="xs math" version="2.0">
<xsl:output method="xml" version="1.0" omit-xml-declaration="no" encoding="UTF-8" indent="yes"/>
<!-- <xsl:mode on-no-match="shallow-copy"/> -->
<xsl:strip-space elements="*"/>
<!-- define variables [start] -->
<xsl:variable name="noOfSplits" select="3"/>
<!-- define variables [end] -->
<!--- an alternative to shallow-copy in xslt 2.0 -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!--- an alternative to shallow-copy in xslt 2.0 -->
<xsl:template match="/">
<xsl:variable name="original-root-element" select="*"/>
<xsl:variable name="groups">
<xsl:for-each-group select="//pair" group-by="@xc:value">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:for-each-group select="current-group()/maturity" group-by="@xc:value">
<xsl:copy>
<xsl:copy-of select="@*, current-group()/node()"/>
</xsl:copy>
</xsl:for-each-group>
</xsl:copy>
</xsl:for-each-group>
</xsl:variable>
<xsl:for-each-group select="$groups/pair" group-by="(position() - 1) mod $noOfSplits">
<xsl:result-document href="files/split{position()}.xml">
<xsl:apply-templates select="$original-root-element">
<xsl:with-param name="contents" select="current-group()" tunnel="yes"/>
</xsl:apply-templates>
</xsl:result-document>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="//smile">
<xsl:param name="contents" tunnel="yes"/>
<xsl:copy>
<xsl:copy-of select="$contents"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
请您帮助了解上述代码有什么问题......
提前致谢
【问题讨论】:
-
好吧,您必须将输入缩短为演示问题所需的最小数据,然后您需要显示该输入所需的结果。简单地告诉我们 XSLT“不工作”并不能解释您想要哪个结果以及为什么您编写或复制了呈现的 XSLT,它似乎试图对各种元素进行分组。另外,当您提到 Saxon 并想要拆分文件时,也许使用 Saxon 9.8 和 XSLT 3 会使您的任务更轻松,请参阅xslt-3-by-example.blogspot.de/2017/06/…
-
请不要告诉我们什么“不起作用”。我们需要知道它是如何失败的。
-
嗨,马丁,感谢您的回复......
-
抱歉不清楚,我的互联网连接看起来有些问题,我的评论没有正确提交......我正在使用 saxon-he-9.4.0.7.jar。是的,我想根据 fxsm:pair 的值拆分文件。我希望 files/split0.xml pair1 & pair4 中的 pair3 在 files/split1.xml 中,而 pair2 在 files/split2.xml 中