首页 > 解决方案 > 如何使用 xslt 按功能将元素的值与其他兄弟姐妹的值进行比较

问题描述

我有以下 xml -

<Invoices>
    <Invoice>
        <InvoiceNum>1234</InvoiceNum>
        <BusinessNum>9999</BusinessNum>
    </Invoice>
    <Invoice>
        <InvoiceNum>1234</InvoiceNum>
        <BusinessNum>9999</BusinessNum>
    </Invoice>
    <Invoice>
        <InvoiceNum>1235</InvoiceNum>
        <BusinessNum>9998</BusinessNum>
    </Invoice>
    <Invoice>
        <InvoiceNum>1235</InvoiceNum>
        <BusinessNum>9990</BusinessNum>
    </Invoice>
</Invoices>

首先,我必须根据发票编号按此 XML 进行分组,然后仅当发票编号的节点的业务编号相同时,我才必须进行映射。例如 - InvoiceNum 1234 是允​​许的,因为两个节点中的 BusinessNum 相同,而不允许使用 1235,因为两个节点中的 businessNum 不同。

我在 XSLT 下尝试过 -

 <xsl:for-each-group select="/Invoices" group-by="Invoice">
       <xsl:if test="preceding-sibling::current-group()/BusinessNum[1] = BusinessNum">
</xsl:if>

// Further mapping

上面的 XSLT 映射不起作用。你能帮我用 xslt 2.0 做这个映射吗?

标签: xmlxsltxslt-2.0

解决方案


以下 xslInvoiceNum通过检查BusinessNum每个组中的所有值是否相同来选择 "allowed" 的值:

<xsl:template match="Invoices">
      <xsl:for-each-group select="Invoice" group-by="InvoiceNum">
             <xsl:if test="count(distinct-values(current-group()/BusinessNum))=1">
                    <xsl:value-of select="current-grouping-key()"/>                     
              </xsl:if>
      </xsl:for-each-group>
</xsl:template>

推荐阅读