所以我坚持使用XSLT 1.0
在我的XML中,我有类似的东西:
<BenefitDefinitions>
<BenefitDefinition>
<BenefitCode>A</BenefitCode>
<FulfillmentName>Test</FulfillmentName>
</BenefitDefinition>
<BenefitDefinition>
<BenefitCode>B</BenefitCode>
<FulfillmentName>Test</FulfillmentName>
</BenefitDefinition>
<BenefitDefinition>
<BenefitCode>C</BenefitCode>
<FulfillmentName>Test</FulfillmentName>
</BenefitDefinition>
</BenefitDefinitions>
...
<Coverage>
<Cover>
<BenefitCode>A</BenefitCode>
<Cover>
</Coverage>
逻辑需要有多个好处的定义具有相同履行名称的定义 - 我需要检查它们是否作为封面存在。两者之间的联系是BenefitCode。
我尝试使用密钥根据履行名称
将BenefitsDefinitions分组 <xsl:key name="benefits-by-fulfillmentname" match="BenefitDefinition" use="FulfillmentName/text()" />
我可以遍历超过1的组
<xsl:for-each select="//BenefitDefinition[count(. | key('benefits-by-fulfillmentname', FulfillmentName/text())[1]) = 1]">
我还可以通过以下方式遍历该组的benefitDefinition:
<xsl:for-each select="key('benefits-by-fulfillmentname', FulfillmentName/text())">
但我无法弄清楚我是如何利用钥匙来计算的。
我想要这样的事情:
<xsl:value-of select="count(../../../../Contract/Risks/PersonContractRisk[RiskId = $riskId]/Coverage/Cover[BenefitCode=key('benefits-by-fulfillmentname', BenefitCode)])"/>
但那不起作用 - 我不熟悉xslt,所以不要太惊讶。
我所有的搜索只是告诉我如何计算属于该组的benefitDefinitions ..但我需要更高级,并找出该benefitDefinition组有多少封面。
我想要去的地方(如果这有帮助)是针对每个benefitDefinition组,如果有一个封面输出1的东西,否则输出其他东西。
答案 0 :(得分: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:key name="benefits-by-fulfillmentname" match="BenefitDefinition" use="FulfillmentName" />
<xsl:key name="cover-by-benefitcode" match="Cover" use="BenefitCode" />
<xsl:template match="/">
<output>
<xsl:for-each select="root/BenefitDefinitions/BenefitDefinition[count(. | key('benefits-by-fulfillmentname', FulfillmentName)[1]) = 1]">
<group name="{FulfillmentName}">
<xsl:choose>
<xsl:when test="key('cover-by-benefitcode', key('benefits-by-fulfillmentname', FulfillmentName)/BenefitCode)">
<xsl:text>there is a cover</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>there is not</xsl:text>
</xsl:otherwise>
</xsl:choose>
</group>
</xsl:for-each>
</output>
</xsl:template>
</xsl:stylesheet>
当这适用于以下有效 XML测试输入时:
<root>
<BenefitDefinitions>
<BenefitDefinition>
<BenefitCode>A</BenefitCode>
<FulfillmentName>group A</FulfillmentName>
</BenefitDefinition>
<BenefitDefinition>
<BenefitCode>B</BenefitCode>
<FulfillmentName>group A</FulfillmentName>
</BenefitDefinition>
<BenefitDefinition>
<BenefitCode>C</BenefitCode>
<FulfillmentName>group A</FulfillmentName>
</BenefitDefinition>
<BenefitDefinition>
<BenefitCode>C</BenefitCode>
<FulfillmentName>group B</FulfillmentName>
</BenefitDefinition>
</BenefitDefinitions>
<Coverage>
<Cover>
<BenefitCode>B</BenefitCode>
</Cover>
</Coverage>
</root>
结果将是:
<?xml version="1.0" encoding="UTF-8"?>
<output>
<group name="group A">there is a cover</group>
<group name="group B">there is not</group>
</output>