0

鉴于此 xml 示例文档:

<?xml version="1.0"?>
<Brown1>
   <Transaction>
    <Acct_Id>7801177</Acct_Id>
    <Acct_Nm>Name1</Acct_Nm>
    <Trans_Num>116902</Trans_Num>
    <Trans_Desc>Buy</Trans_Desc>
    <Trans_Result>Closed</Trans_Result>
   </Transaction> 
   <Transaction>
    <Acct_Id>7801177</Acct_Id>
    <Acct_Nm>Name1</Acct_Nm>
    <Trans_Num>116903</Trans_Num>
    <Trans_Desc>Sell</Trans_Desc>
    <Trans_Result>Closed</Trans_Result>
   </Transaction> 
   <Transaction>
    <Acct_Id>7801177</Acct_Id>
    <Acct_Nm>Name1</Acct_Nm>
    <Trans_Num>116904</Trans_Num>
    <Trans_Desc>Buy</Trans_Desc>
    <Trans_Result>Open</Trans_Result>
   </Transaction> 
   <Transaction>
    <Acct_Id>8692031</Acct_Id>
    <Acct_Nm>Name2</Acct_Nm>
    <Trans_Num>116932</Trans_Num>
    <Trans_Desc>Buy</Trans_Desc>
    <Trans_Result>Open</Trans_Result>
   </Transaction> 
    <Transaction>
    <Acct_Id>8692031</Acct_Id>
    <Acct_Nm>Name2</Acct_Nm>
    <Trans_Num>116999</Trans_Num>
    <Trans_Desc>Sell</Trans_Desc>
    <Trans_Result>Closed</Trans_Result>
   </Transaction> 
</Brown1>

我想出来的是这个

7801177 Name1

116902 Buy Closed
116903 Sell Closed
116904 Buy Open

8692031 Name2
116932 Buy Open
116999 Sell Closed

基本上只打印一次帐户和名称

设置模板有点像这样:

<xsl:template name="header">
  <xsl:value-of select="Acct_Id"/>
  <xsl:value-of select="Acct_Nm"/>

  <xsl:call-template name="report_data">
</xsl:template>

<xsl:template name="report_data">
  <xsl:for-each select=".">
    <xsl:value-of select="Trans_Num"/>
    <xsl:value-of select="Trans_Desc"/>
    <xsl:value-of select="Trans_Result"/>
  </xsl:for-each>
 </xsl:template>

这产生Acct_Id&Acct_Nm每次。如果下一个节点处理时它们相同,我该如何排除它们?

我假设在标题模板中,但我一直无法得到解决方案。

这似乎是一件简单的事情?...

我可以将其保存Acct_Id在标题模板中并将其与下一个进行比较并且Acct_Id仅在不同时打印?

4

1 回答 1

0

这种转变

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kTransByAcct" match="Transaction" use="Acct_Id"/>

 <xsl:template match=
  "Transaction[generate-id()
              =generate-id(key('kTransByAcct',Acct_Id)[1])]">
    <xsl:value-of select="concat('&#xA;',Acct_Id, ' ', Acct_Nm, '&#xA;')"/>
    <xsl:apply-templates select="key('kTransByAcct',Acct_Id)" mode="group"/>
 </xsl:template>

 <xsl:template match="*" mode="group">
  <xsl:value-of select="concat('&#9;',Trans_Num,' ',Trans_Desc,' ',Trans_Result,'&#xA;')"/>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<Brown1>
   <Transaction>
    <Acct_Id>7801177</Acct_Id>
    <Acct_Nm>Name1</Acct_Nm>
    <Trans_Num>116902</Trans_Num>
    <Trans_Desc>Buy</Trans_Desc>
    <Trans_Result>Closed</Trans_Result>
   </Transaction>
   <Transaction>
    <Acct_Id>7801177</Acct_Id>
    <Acct_Nm>Name1</Acct_Nm>
    <Trans_Num>116903</Trans_Num>
    <Trans_Desc>Sell</Trans_Desc>
    <Trans_Result>Closed</Trans_Result>
   </Transaction>
   <Transaction>
    <Acct_Id>7801177</Acct_Id>
    <Acct_Nm>Name1</Acct_Nm>
    <Trans_Num>116904</Trans_Num>
    <Trans_Desc>Buy</Trans_Desc>
    <Trans_Result>Open</Trans_Result>
   </Transaction>
   <Transaction>
    <Acct_Id>8692031</Acct_Id>
    <Acct_Nm>Name2</Acct_Nm>
    <Trans_Num>116932</Trans_Num>
    <Trans_Desc>Buy</Trans_Desc>
    <Trans_Result>Open</Trans_Result>
   </Transaction>
    <Transaction>
    <Acct_Id>8692031</Acct_Id>
    <Acct_Nm>Name2</Acct_Nm>
    <Trans_Num>116999</Trans_Num>
    <Trans_Desc>Sell</Trans_Desc>
    <Trans_Result>Closed</Trans_Result>
   </Transaction>
</Brown1>

产生想要的正确结果:

7801177 Name1
    116902 Buy Closed
    116903 Sell Closed
    116904 Buy Open

8692031 Name2
    116932 Buy Open
    116999 Sell Closed

说明

正确使用孟池分组法

更新

OP 强烈要求“非关键解决方案”。

请注意,非密钥解决方案具有二次时间复杂度 - O(N^2),而基于密钥的解决方案接近 O(1)。前者可能比后者慢许多数量级。

我强烈建议并敦促您不要将基于非密钥的 XSLT 1.0 解决方案用于任何实际目的

这是请求的非基于键的分组解决方案:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="Transaction[not(Acct_Id=preceding-sibling::*/Acct_Id)]">
    <xsl:value-of select="concat('&#xA;',Acct_Id, ' ', Acct_Nm, '&#xA;')"/>
    <xsl:apply-templates mode="group" select=
    ". | following-sibling::*[current()/Acct_Id = Acct_Id]"/>
 </xsl:template>

 <xsl:template match="*" mode="group">
  <xsl:value-of select="concat('&#9;',Trans_Num,' ',Trans_Desc,' ',Trans_Result,'&#xA;')"/>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

当将此转换应用于同一个 XML 文档(上图)时,会产生相同的所需、正确的结果

7801177 Name1
    116902 Buy Closed
    116903 Sell Closed
    116904 Buy Open

8692031 Name2
    116932 Buy Open
    116999 Sell Closed
于 2013-01-06T21:09:26.547 回答