微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

迭代后 XSLT 3.0 断言和异常抛出

如何解决迭代后 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>&#x9;&#xA;</xsl:text>
        <xsl:text>Retro: Min NPV and BPV sensitivity</xsl:text>
        <xsl:text>&#x9;&#xA;</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>&#x9;&#xA;</xsl:text>
        <xsl:text>Retro: Max NPV and BPV sensitivity</xsl:text>
        <xsl:text>&#x9;&#xA;</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>&#x9;&#xA;</xsl:text>
        <xsl:text>Retro: Average NPV and BPV ShiftDown</xsl:text>
        <xsl:text>&#x9;&#xA;</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 举报,一经查实,本站将立刻删除。