xslt 1.0消除重复并检查条件

时间:2013-11-16 14:54:30

标签: xslt

这是我的输入。我需要消除重复的数字并检查状态是否为空而状态不是Y,我该如何在xslt1.0中执行此操作?

<depositAccount>
        <EligibleDepAccount>
           <type>TIP</type>
           <market>111</market>
           <number>12345678</number>
           <status>Y</status>
           <productCode>OBN</productCode>
        </EligibleDepAccount>
        <EligibleDepAccount>
           <type>TIP</type>
           <market>111</market>
           <number>12345678</number>
           </status>
           <productCode>OBN</productCode>
        </EligibleDepAccount>
        <EligibleDepAccount>
           <type>TIP</type>
           <market>111</market>
           <number>9999999</number>
           <status>N</status>
           <productCode>OBN</productCode>
         </EligibleDepAccount>
        <EligibleDepAccount>
           <type>TIP</type>
           <market>111</market>
           <number>5435678</number>
           </status>
           <productCode>OBN</productCode>
         </EligibleDepAccount>
</depositAccount>

输出应该是这样的..

     <depositAccount>
        <EligibleDepAccount>
           <type>TIP</type>
           <market>111</market>
           <number>12345678</number>
           <status>Y</status>
           <productCode>OBN</productCode>
        </EligibleDepAccount>
        <EligibleDepAccount>
           <type>TIP</type>
           <market>111</market>
           <number>9999999</number>
           <status>N</status>
           <productCode>OBN</productCode>
         </EligibleDepAccount>
        <EligibleDepAccount>
           <type>TIP</type>
           <market>111</market>
           <number>5435678</number>
           </status>
           <productCode>OBN</productCode>
         </EligibleDepAccount>
</depositAccount>

我尝试使用下面的代码,似乎无法正常工作

    <xsl:for-each-group select="$depositAccount/EligibleDepAccount" group-by="number">  
           <xsl:if test="count(current-group()) &gt; 1">
                <xsl:if test="$depositAccount/EligibleDepAccount/status/text()='Y'">
                    <xsl:copy-of select="current_group()"/>
                </xsl:if>                   
            </xsl:if>
    </xsl:for-each-group>  

请帮助

1 个答案:

答案 0 :(得分:1)

如果您使用的是XLST 1.0 porecessor,则使用xsl:for-each-group将无效。 xsl:for-each-group是XSLT 2.0的一部分。

要使用XSLT 1.0解决分组问题,您可以使用名为“Meunchian Grouping”的技术。

您的预期输出与您的目标不一致“我需要...检查状态是否为空且状态不是Y”,因为您的输出中有一个值为“Y”的状态元素。

无论如何,我认为你需要的XSLT类型是:

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

  <xsl:key name="eligibleDepAccountsByNumber" match="EligibleDepAccount" use="number" />

  <xsl:template match="/">
    <depositAccount>
      <xsl:apply-templates select="depositAccount/EligibleDepAccount[generate-id() = generate-id(key('eligibleDepAccountsByNumber', number)[1])]" />
    </depositAccount>
  </xsl:template>

  <xsl:template match="EligibleDepAccount">
    <xsl:if test="status/text() != 'Y'">
      <xsl:copy-of select="."/>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>