我有包含依赖组件的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>i对
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>我想在迭代结果完成后立即验证它。如果任何验证失败,则报告异常并终止程序。但是,验证在迭代之后并不是。(实际的验证是通过
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验证解决方案是什么?
发布于 2021-01-14 00:09:05
如果我正确理解这个问题,这是一个标准的多相转换。您可以使用两个单独的样式表,使用一些外部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"/>https://stackoverflow.com/questions/65558051
复制相似问题