2016-03-04 47 views
0

我正试图计算医疗保险的合同核销,但计算似乎没有工作。例如,我需要取<charge>标签上的费用属性值,然后减去<adjustment>标签上的金额属性值,但仅当<adjustment>标签上的组和代码属性为:group ='CO'和代码='45'或'385'xslt计算保险注销不起作用

我能够得到一切,但计算工作。我试着在这个论坛上看到几个答案,但我明显错过了一些东西。任何帮助,将不胜感激。

这里是我的XML(简体):

<result check_number="05173408" ...> 
    <claim ... total_charge="720" total_paid="43"> 
     <charge charge="200"> 
      <adjustment amount="125" code="45" group="CO" /> 
      <adjustment amount="35" code="385" group="CO" /> 
      <adjustment amount="20" code="3" group="PR" /> 
     </charge> 
     <charge charge="70"> 
      <adjustment amount="70" code="204" group="PR" /> 
     </charge> 
     <charge charge="300"> 
      <adjustment amount="273" code="45" group="CO" /> 
      <adjustment amount="15" code="3" group="PR" /> 
     </charge> 
     <charge charge="150"> 
      <adjustment amount="139" code="45" group="CO" /> 
     </charge> 
    </claim> 
</result> 

这里是我的XSLT把日期:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xsl"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 
    <xsl:template match="/"> 
     <!-- maps to the beginning result tag --> 
     <xsl:for-each select="/result/claim/charge"> 
     <!-- amount allowed by the insurance for line item --> 
      <COL> 
       <DATA> 
       <xsl:apply-templates select="adjustment" mode="calcAdjTotal" > 
       </xsl:apply-templates> 
       </DATA> 
      </COL> 
     </xsl:for-each> 
     <!-- Template created to test Parfait's suggestion --> 
     <xsl:template match="adjustment" mode="calcAdjTotal" > 
      <xsl:variable name="condition" select="adjustment[@group='CO' and (@code='45' or @code='385')]"></xsl:variable> 
       <xsl:value-of select="../@charge - sum($condition/@amount)" /> 
      </xsl:if> 
     </xsl:template> 
    </xsl:template> 
</xsl:stylesheet> 

这里是我的输出:(更新输出)

<COL> 
    </DATA> 
</COL> 
<COL> 
    </DATA> 
</COL> 
<COL> 
    </DATA> 
</COL> 
<COL> 
    </DATA> 
</COL> 

这里的我想要得到的:

<COL> 
    <DATA> 
     40 
    </DATA> 
</COL> 
<COL> 
    <DATA> 
    </DATA> 
</COL> 
<COL> 
    <DATA> 
     27 
    </DATA> 
</COL> 
<COL> 
    <DATA> 
     11 
    </DATA> 
</COL> 

然后将使用该格式将数据导入Filemaker。

+0

您能否以文字解释所需的逻辑?从示例或非工作代码中很难推断出它。如果我从扣款中扣除符合条件的调整,我会得到{40,70,27,11}。你显示{40,,27,11}。 –

回答

1

考虑将您的条件方程包装在<xsl:if>中。此外,您可以使用一个存储条件值的变量来避免重复:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output version="1.0" encoding="UTF-8" indent="yes" /> 
<xsl:strip-space elements="*"/>  

    <xsl:template match="/"> 
    <ROOT> 
     <xsl:apply-templates select="*"/> 
    </ROOT> 
    </xsl:template> 

    <xsl:template match="charge"> 
    <xsl:variable name="condition" select="adjustment[(@code='45' or @code='385') and @group='CO']"/>   
    <COL> 
     <DATA> 
     <xsl:if test="$condition">    
      <xsl:value-of select="@charge - sum($condition/@amount)"/>    
     </xsl:if> 
     </DATA> 
    </COL>  
    </xsl:template>  
</xsl:transform> 
+0

@ michael.hor257k和Parfait,谢谢你的帮助!帕菲特的解决方案奏效。我修改了一些xslt,我从调整标记开始,而不是电荷标记,但它创建了所需的结果。我在变量=“@ code = '45'或'385'”和我的值 - select =“../@ charge - sum(@amount)”上设置了我的选择。当我不需要时,我试图使用递归。再次感谢。 – JMW

+0

我做了一些更多的测试,你的xml仅适用于一个数量属性,我需要它为多个属性工作。在我的示例xml中查看标记的顶部组。 – JMW

+0

这里的答案有条件地汇总所有调整节点。你是说40对第一个'充电'组不正确:200 - (125 + 35)= 40?如果不是这种情况,请发布XML。 – Parfait

1

我猜你想要的东西,像(!):

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/result"> 
    <RESULT> 
     <xsl:for-each select="claim/charge"> 
      <ROW> 
       <COL> 
        <DATA> 
         <xsl:value-of select="@charge - sum(adjustment[@group='CO' and (@code='45' or @code='385')]/@amount)" /> 
        </DATA> 
       </COL> 
      </ROW> 
     </xsl:for-each> 
    </RESULT> 
</xsl:template> 

</xsl:stylesheet> 

应用到你的输入例子,结果将是:

<?xml version="1.0" encoding="UTF-8"?> 
<RESULT> 
    <ROW> 
     <COL> 
     <DATA>40</DATA> 
     </COL> 
    </ROW> 
    <ROW> 
     <COL> 
     <DATA>70</DATA> 
     </COL> 
    </ROW> 
    <ROW> 
     <COL> 
     <DATA>27</DATA> 
     </COL> 
    </ROW> 
    <ROW> 
     <COL> 
     <DATA>11</DATA> 
     </COL> 
    </ROW> 
</RESULT> 

这是假设你想为每个charge创建一个记录(有一个字段)。

请注意,这是无效的FileMaker XML语法。


- 响应编辑,以澄清在评论: -

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/result"> 
    <RESULT> 
     <xsl:for-each select="claim/charge[adjustment[not(@group='PR')]]"> 
      <ROW> 
       <COL> 
        <DATA> 
         <xsl:value-of select="@charge - sum(adjustment[not(@group='PR')]/@amount)" /> 
        </DATA> 
       </COL> 
      </ROW> 
     </xsl:for-each> 
    </RESULT> 
</xsl:template> 

</xsl:stylesheet> 

结果

<?xml version="1.0" encoding="UTF-8"?> 
<RESULT> 
    <ROW> 
     <COL> 
     <DATA>40</DATA> 
     </COL> 
    </ROW> 
    <ROW> 
     <COL> 
     <DATA>27</DATA> 
     </COL> 
    </ROW> 
    <ROW> 
     <COL> 
     <DATA>11</DATA> 
     </COL> 
    </ROW> 
</RESULT> 
+0

我需要找到所有带有group ='CO'和code = '45'或'385'的调整标签。然后从charge标签的费用属性的金额中减去amount属性的金额。 所以,我需要从输出中排除group ='PR'的调整标签。 最终,我需要200-125-35 = 40,一个空标签或0,300-273 = 27和150-139 = 11作为标签的输出。 – JMW

+0

@JMW为什么一个空标签或0而不是70 - 0 = 70? –

+0

是的,我知道这是无效的Filemaker XML语法。我有一个更大的xslt可以创建有效的Filemaker XML。这只是它的一部分。我正试图找出为什么我的数学计算不起作用。 – JMW