如何解决迭代后 XSLT 3.0 断言和异常抛出
我有包含依赖组件的 XSLT 模块:迭代、验证和……
输入示例 port1.xml
<valuationDocument>
<valuationSet id="val1">
<assetValuation>
<objectReference href="tid-1" />
<quote>
<value>1000000</value>
<sensitivitySet>
<sensitivity name="SEP21">0.707</sensitivity>
<sensitivity name="2Y">1.82</sensitivity>
<sensitivity name="3Y">2.73</sensitivity>
<sensitivity name="4Y">3.68</sensitivity>
<sensitivity name="5Y">4.51</sensitivity>
<sensitivity name="7Y">3.64</sensitivity>
<sensitivity name="10Y">9.06</sensitivity>
<sensitivity name="MAR21">0.315</sensitivity>
<sensitivity name="15Y">13.59</sensitivity>
</sensitivitySet>
</quote>
</assetValuation>
<assetValuation>
<objectReference href="tid-2" />
<quote>
<value>1100000</value>
<sensitivitySet>
<sensitivity name="SEP21">0.947</sensitivity>
<sensitivity name="MAR21">0.502</sensitivity>
<sensitivity name="2Y">1.91</sensitivity>
<sensitivity name="3Y">2.84</sensitivity>
<sensitivity name="4Y">3.72</sensitivity>
<sensitivity name="5Y">4.63</sensitivity>
<sensitivity name="7Y">3.71</sensitivity>
<sensitivity name="10Y">9.15</sensitivity>
<sensitivity name="15Y">13.64</sensitivity>
</sensitivitySet>
</quote>
</assetValuation>
</valuationSet>
</valuationDocument>
我对 iteration
组件很满意(使 streaming
无法使用……)。迭代结果如下:
<valuationDocument>
<valuationSet id="val1">
<assetValuation>
<objectReference href="tid-1"/>
<quote>
<value>1000000</value>
<BasisPointValue>
<shiftUp units="100bp" sensitivityName="SEP21" sensitivity="0.707">992,930.00</shiftUp>
<shiftDown units="100bp" sensitivityName="SEP21" sensitivity="0.707">1,007,070.00</shiftDown>
==========================================================================================
<shiftUp units="100bp" sensitivityName="15Y" sensitivity="13.59">864,100.00</shiftUp>
<shiftDown units="100bp" sensitivityName="15Y" sensitivity="13.59">1,135,900.00</shiftDown>
</BasisPointValue>
<sensitivitySet>
<sensitivity name="SEP21">0.707</sensitivity>
<sensitivity name="2Y">1.82</sensitivity>
<sensitivity name="3Y">2.73</sensitivity>
<sensitivity name="4Y">3.68</sensitivity>
<sensitivity name="5Y">4.51</sensitivity>
<sensitivity name="7Y">3.64</sensitivity>
<sensitivity name="10Y">9.06</sensitivity>
<sensitivity name="MAR21">0.315</sensitivity>
<sensitivity name="15Y">13.59</sensitivity>
</sensitivitySet>
</quote>
</assetValuation>
<assetValuation>
<objectReference href="tid-2" />
<quote>
<value>1100000</value>
<BasisPointValue>
<shiftUp units="100bp" sensitivityName="SEP21" sensitivity="0.947">1,089,583.00</shiftUp>
<shiftDown units="100bp" sensitivityName="SEP21" sensitivity="0.947">1,110,417.00</shiftDown>
==========================================================================================
<shiftUp units="100bp" sensitivityName="15Y" sensitivity="13.64">949,960.00</shiftUp>
<shiftDown units="100bp" sensitivityName="15Y" sensitivity="13.64">1,250,040.00</shiftDown>
</BasisPointValue>
<sensitivitySet>
<sensitivity name="SEP21">0.947</sensitivity>
<sensitivity name="MAR21">0.502</sensitivity>
<sensitivity name="2Y">1.91</sensitivity>
<sensitivity name="3Y">2.84</sensitivity>
<sensitivity name="4Y">3.72</sensitivity>
<sensitivity name="5Y">4.63</sensitivity>
<sensitivity name="7Y">3.71</sensitivity>
<sensitivity name="10Y">9.15</sensitivity>
<sensitivity name="15Y">13.64</sensitivity>
</sensitivitySet>
</quote>
</assetValuation>
</valuationSet>
</valuationDocument>
我想在完成后立即验证迭代结果。如果任何验证失败,则会报告异常并终止程序。但是,验证ISN'T 在迭代之后进行了。 (实际验证是通过 xsl:try|catch
引发异常并在任何断言失败时终止)
验证逻辑是将 sensitivitySet/sensitivity
的三个指标与迭代转换后的 BasisPointValue/shiftUp|shiftDown/@sensitivity
(注意:xsl:text 是模拟异常抛出,显然XSLT 编辑器不能发出消息)
<xsl:variable name="mine">
<!-- <xsl:message terminate="yes">Fatal error: Minimum NPV and BPV sensitivity is different</xsl:message>-->
<xsl:text>	
</xsl:text>
<xsl:text>Retro: Min NPV and BPV sensitivity</xsl:text>
<xsl:text>	
</xsl:text>
</xsl:variable>
<xsl:variable name="MaxE">
<!--<xsl:message terminate="yes">Fatal error: Maximum NPV and BPV sensitivity is different</xsl:message>-->
<xsl:text>	
</xsl:text>
<xsl:text>Retro: Max NPV and BPV sensitivity</xsl:text>
<xsl:text>	
</xsl:text>
</xsl:variable>
<xsl:variable name="AvgDownE">
<!--<xsl:message terminate="yes">Fatal error: Average NPV and BPV ShiftDown sensitivity is different</xsl:message>-->
<xsl:text>	
</xsl:text>
<xsl:text>Retro: Average NPV and BPV ShiftDown</xsl:text>
<xsl:text>	
</xsl:text>
</xsl:variable>
<xsl:template match="/">
<xsl:source-document href="port1.xml">
<xsl:apply-templates select="valuationDocument" mode="val"/>
</xsl:source-document>
</xsl:template>
<xsl:template match="sensitivitySet" mode="val">
<!-- IteraTION -->
==========================================
<!-- <xsl:apply-imports/>-->
<xsl:copy-of select="."/>
<xsl:apply-templates select="parent::quote" mode="validation"/>
</xsl:template>
<!-- VALIDATION -->
<xsl:template match="quote" mode="validation" expand-text="yes">
<Assertion>
<xsl:variable name="m" as="map(*)">
<xsl:map>
<xsl:map-entry key="'min-npv'" select="min(outermost(descendant::sensitivity)/number())"/>
<xsl:map-entry key="'max-npv'" select="max(outermost(descendant::sensitivity)/number())"/>
<xsl:map-entry key="'min-bpv'" select="min(outermost(descendant::BasisPointValue//@sensitivity)/number())"/>
<xsl:map-entry key="'max-bpv'" select="max(outermost(descendant::BasisPointValue//@sensitivity)/number())"/>
<xsl:map-entry key="'avg-npv'" select="avg(outermost(descendant::sensitivity)/number())"/>
<xsl:map-entry key="'avg-bpv-down'" select="avg(outermost(descendant::BasisPointValue/shiftDown/@sensitivity)/number())"/>
</xsl:map>
</xsl:variable>
<xsl:choose>
<xsl:when test="deep-equal($m('min-npv'),$m('min-bpv'))">
<xsl:value-of select="$mine"/>
</xsl:when>
<xsl:when test="deep-equal($m('max-npv'),$m('max-bpv'))">
<xsl:value-of select="$MaxE"/>
</xsl:when>
<xsl:when test="deep-equal($m('avg-npv'),$m('avg-bpv-down'))">
<xsl:value-of select="$AvgDownE"/>
</xsl:when>
<xsl:otherwise><xsl:value-of select="'Validation Succeeds!'"/></xsl:otherwise>
</xsl:choose>
</Assertion>
</xsl:template>
迭代后验证的XSLT3.0方案是什么?
解决方法
如果我正确理解了这个问题,这是一个标准的多相转换。您可以使用两个单独的样式表,通过一些外部 API(例如 shell 脚本、Ant/gradle、XProc、Java 应用程序)链接在一起,或者您可以使用逻辑将两个阶段放在同一个样式表中
<xsl:variable name="temp">
<xsl:apply-templates select="/" mode="phase-1"/>
</xsl:variable>
<xsl:apply-templates select="$temp" mode="phase-2"/>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。