与根据xpath计数进行xslt分组和查询有关

  • 本文关键字:查询 xslt xpath xslt-1.0
  • 更新时间 :
  • 英文 :


所以我坚持使用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>

逻辑需要是在有多个利益定义的地方,这些定义具有相同的fulfillmentName -我需要检查它们中的任何一个是否存在作为掩护。两者之间的联系是BenefitCode

我尝试使用一个键将基于履行名称的benefitDefinitions分组

  <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]">

我还可以遍历该组的benefitDefinitions:

<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,所以不太奇怪。

我所有的搜索只是告诉我如何计算属于该组的利益定义。但是我需要更深入地了解一下benefits definition组有多少个保险。

我想去的地方(如果这有帮助的话)是每个benefitDefinition组,如果有一个cover输出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>

相关内容

  • 没有找到相关文章

最新更新