【问题标题】:WANTED: xslt hack to get rid of duplicates in output通缉:xslt hack 以消除输出中的重复项
【发布时间】:2017-02-03 21:33:42
【问题描述】:

在以下 xml-data 中,几个项目具有不同的 ID。例如,项目“apfel”有多个 ID,而不是始终相同。

<lieferungen>
    <artikel id="3526">
        <name>apfel</name>
        <lieferant>Fa. Krause</lieferant>
        <preis stueckpreis="true">8.97</preis>
    </artikel>
    <artikel id="7866">
        <name>Kirschen</name>
        <preis stueckpreis="false">10.45</preis>
        <lieferant>Fa. Helbig</lieferant>
    </artikel>
    <artikel id="3526">
        <preis stueckpreis="true">12.67</preis>
        <lieferant>Fa. Liebig</lieferant>
        <name>apfel</name>
    </artikel>
    <artikel id="7866">
        <preis stueckpreis="false">17.67</preis>
        <name>Kirschen</name>
        <lieferant>Fa. Krause</lieferant>
    </artikel>
    <artikel id="3627">
        <name>apfel</name>
        <lieferant>Fa. Mertes</lieferant>
        <preis stueckpreis="true">9.54</preis>
    </artikel>
    <artikel id="7866">
        <name>Kirschen</name>
        <lieferant>Fa. Hoeller</lieferant>
        <preis stueckpreis="false">16.45</preis>
    </artikel>
    <artikel id="7868">
        <preis>3.20</preis>
        <name>Kohl</name>
        <lieferant>Fa. Hoeller</lieferant>
    </artikel>
    <artikel id="7866">
        <name>Kirschen</name>
        <lieferant>Fa. Richard</lieferant>
        <preis stueckpreis="false">12.45</preis>
    </artikel>
    <artikel id="3245">
        <preis stueckpreis="false">15.67</preis>
        <name>Bananen</name>
        <lieferant>Fa. Hoeller</lieferant>
    </artikel>
    <artikel id="6745">
        <name>Kohl</name>
        <lieferant>Fa. Reinhardt</lieferant>
        <preis stueckpreis="false">3.10</preis>
    </artikel>
    <artikel id="7789">
        <name>Ananas</name>
        <preis stueckpreis="true">8.60</preis>
        <lieferant>Fa. Richard</lieferant>
    </artikel>
</lieferungen>

我想将不一致的地方总结如下:

为此,我编写了以下 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="html" encoding="utf-8"/>

    <xsl:template match="lieferungen">
        <html>
            <head>
                <title>
                    <xsl:text>Inkonsistenzen</xsl:text>
                </title>
            </head>
            <body bgcolor="#ffffff">
                <h1>
                    <xsl:text>Inkonsistenzen</xsl:text>
                </h1>
                <hr/>
                <p>
                    <xsl:text>Die Datei enthält folgende Inkonsistenzen: 
                </xsl:text>
                </p>
                    <xsl:apply-templates/>
                <hr/>

            </body>
        </html>
    </xsl:template>

    <xsl:template match="artikel">
        <xsl:variable name="this_name" select="name/text()"/>
        <xsl:variable name="this_id" select="@id"/>
        <xsl:variable name="this_prod" select="lieferant/text()"/>

        <xsl:for-each select="//artikel">
            <xsl:if test="name/text() = $this_name">
                <xsl:if test="not(@id = $this_id)">
                    <p>
                        <xsl:text>Inkonsistenz: Name1=</xsl:text>
                        <xsl:value-of select="$this_name"/>
                        <xsl:text>; Lieferant1=</xsl:text>
                        <xsl:value-of select="$this_prod"/>
                        <xsl:text>; ID1=</xsl:text>
                        <u>
                            <b>
                                <xsl:value-of select="$this_id"/>
                            </b>
                        </u>
                        <xsl:text> ; Name2=</xsl:text>
                        <xsl:value-of select="name/text()"/>
                        <xsl:text>; Lieferant2=</xsl:text>
                        <xsl:value-of select="lieferant/text()"/>
                        <xsl:text>; ID2=</xsl:text>
                        <u>
                            <b>
                                <xsl:value-of select="@id"/>
                            </b>
                        </u>
                    </p>
                </xsl:if>
            </xsl:if>
        </xsl:for-each>

    </xsl:template>

 </xsl:stylesheet>

输出如下:

Inkonsistenzen


   Die Datei enthält folgende Inkonsistenzen:
   Inkonsistenz: Name1=apfel; Lieferant1=Fa. Krause; ID1=3526 ; Name2=apfel;    
   Lieferant2=Fa. Mertes; ID2=3627
   Inkonsistenz: Name1=apfel; Lieferant1=Fa. Liebig; ID1=3526 ; Name2=apfel; 
   Lieferant2=Fa. Mertes; ID2=3627
   Inkonsistenz: Name1=apfel; Lieferant1=Fa. Mertes; ID1=3627 ; Name2=apfel; 
   Lieferant2=Fa. Krause; ID2=3526
   Inkonsistenz: Name1=apfel; Lieferant1=Fa. Mertes; ID1=3627 ; Name2=apfel; 
   Lieferant2=Fa. Liebig; ID2=3526
   Inkonsistenz: Name1=Kohl; Lieferant1=Fa. Hoeller; ID1=7868 ; Name2=Kohl; 
   Lieferant2=Fa. Reinhardt; ID2=6745
   Inkonsistenz: Name1=Kohl; Lieferant1=Fa. Reinhardt; ID1=6745 ; Name2=Kohl; 
   Lieferant2=Fa. Hoeller; ID2=7868

因此,输出包含的项目数量正好是我想要的两倍。原因是每个 Lieferant(供应商)都以 Lieferant 1(供应商 1)和 Lieferant 2(供应商 2)的身份出现。

负责复制的代码如下:

         <xsl:for-each select="//artikel">
            <xsl:if test="name/text() = $this_name">
                <xsl:if test="not(@id = $this_id)">
                    <p>
                        <xsl:text>Inkonsistenz: Name1=</xsl:text>
                        <xsl:value-of select="$this_name"/>
                        <xsl:text>; Lieferant1=</xsl:text>
                        <xsl:value-of select="$this_prod"/>
                        <xsl:text>; ID1=</xsl:text>
                        <u>
                            <b>
                                <xsl:value-of select="$this_id"/>
                            </b>
                        </u>
                        <xsl:text> ; Name2=</xsl:text>
                        <xsl:value-of select="name/text()"/>
                        <xsl:text>; Lieferant2=</xsl:text>
                        <xsl:value-of select="lieferant/text()"/>
                        <xsl:text>; ID2=</xsl:text>
                        <u>
                            <b>
                                <xsl:value-of select="@id"/>
                            </b>
                        </u>
                    </p>
                </xsl:if>
            </xsl:if>
        </xsl:for-each>

我知道为什么当前代码会出现重复,但我不知道如何更改它以获得所需的输出。

【问题讨论】:

标签: xml xslt foreach


【解决方案1】:

最简单的解决方法是更改​​此行...

 <xsl:for-each select="//artikel">

到这个..

 <xsl:for-each select="following-sibling::artikel">

也就是说,与其跟所有artikels比较,不如只比较它后面的(因为前面的已经考虑过了)。

注意,你可以避免一些嵌套,而是将两个xsl:if中的条件添加到xsl:for-each

<xsl:for-each select="following-sibling::artikel[name = $this_name][not(@id = $this_id)]">

【讨论】:

  • 感谢您的解决方案!!
猜你喜欢
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
  • 2023-03-10
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
相关资源
最近更新 更多