【问题标题】:XSL Muenchian grouping - and filteringXSL Muenchian 分组 - 和过滤
【发布时间】:2017-07-12 19:59:06
【问题描述】:

场景是这样的: 我有一家商店,销售来自两家生产商 CompanyA 和 CompanyB 的家具,还从一个进口商 CompanyC 进口家具。

我的文件是这样的

<shop>
    <product>
        <name>Chair</name>
        <colour>Green</colour>
        <producer>CompanyA</producer>
    </product>
    <product>
        <name>Chair</name>
        <colour>Green</colour>
        <producer>CompanyB</producer>
    </product>
    <product>
        <name>Chair</name>
        <colour>Blue</colour>
        <producer>CompanyA</producer>
    </product>
    <product>
        <name>Chair</name>
        <colour>Blue</colour>
        <importer>CompanyC</importer>
    </product>
    <product>
        <name>Table</name>
        <colour>Green</colour>
        <importer>CompanyC</importer>
    </product>
    <product>
        <name>Table</name>
        <colour>Green</colour>
        <producer>CompanyA</producer>
    </product>
    <product>
        <name>Table</name>
        <colour>Blue</colour>
        <producer>CompanyB</producer>
    </product>
    <product>
        <name>Table</name>
        <colour>Blue</colour>
        <importer>CompanyC</importer>
    </product>
</shop>

我想减少库存,所以我需要 CompanyA 和 CompanyC 的类似产品清单。我不想列出来自 CompanyA 和 CompanyB 的类似产品,也不想列出来自 CompanyB 和 CompanyC 的类似产品。 期望的输出是这个

<shop>
    <product>
        <name>Chair</name>
        <colour>Blue</colour>
        <producer>CompanyA</producer>
    </product>
    <product>
        <name>Chair</name>
        <colour>Blue</colour>
        <importer>CompanyC</importer>
    </product>
    <product>
        <name>Table</name>
        <colour>Green</colour>
        <importer>CompanyC</importer>
    </product>
    <product>
        <name>Table</name>
        <colour>Green</colour>
        <producer>CompanyA</producer>
    </product>
</shop>

我已经复制粘贴了一个旧样式表,它为我提供了所有类似产品的列表 - 所以我的问题是:我如何过滤列表,以便它只给出一个来自 CompanyA 和另一个来自 CompanyC 的配对?

我只能使用没有扩展的 XSL 1.0

<?xml version="1.0"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="no"/>

<xsl:key name="duplo" match="product" use="concat(name,colour)"/>

<xsl:template match="/">
    <shop>
        <xsl:for-each select="//product[generate-id(.)=generate-id(key('duplo', concat(name,colour))[2])]">
            <xsl:for-each select="key('duplo', concat(name,colour))">
                <product>
                    <name><xsl:value-of select="name"/></name>
                    <colour><xsl:value-of select="colour"/></colour>
                    <producer><xsl:value-of select="producer"/></producer>
                    <importer><xsl:value-of select="importer"/></importer>
                </product>
            </xsl:for-each>
        </xsl:for-each>
    </shop>
</xsl:template>

</xsl:stylesheet>

【问题讨论】:

    标签: xml xslt muenchian-grouping


    【解决方案1】:

    一种方法是将现有的xsl:for-each 嵌套在xsl:if 条件中

    <xsl:if test="key('duplo', concat(name,colour))[producer = 'CompanyA'] and key('duplo', concat(name,colour))[importer = 'CompanyC']">
        <xsl:for-each select="key('duplo', concat(name,colour))[producer = 'CompanyA' or importer = 'CompanyC']">
            <product>
                <name><xsl:value-of select="name"/></name>
                <colour><xsl:value-of select="colour"/></colour>
                <producer><xsl:value-of select="producer"/></producer>
                <importer><xsl:value-of select="importer"/></importer>
            </product>
        </xsl:for-each>
    </xsl:if>
    

    也许您可以使用变量来减小表达式的大小。例如

    <xsl:variable name="group" select="key('duplo', concat(name,colour))" />
    <xsl:variable name="A" select="$group[producer = 'CompanyA']" />
    <xsl:variable name="B" select="$group[importer = 'CompanyC']" />
    <xsl:if test="$A and $B">
        <xsl:for-each select="$A|$B">
            <product>
                <name><xsl:value-of select="name"/></name>
                <colour><xsl:value-of select="colour"/></colour>
                <producer><xsl:value-of select="producer"/></producer>
                <importer><xsl:value-of select="importer"/></importer>
            </product>
        </xsl:for-each>
    </xsl:if>
    

    【讨论】:

      猜你喜欢
      • 2018-10-20
      • 2013-12-06
      • 2012-07-07
      • 1970-01-01
      • 2014-02-06
      • 1970-01-01
      • 1970-01-01
      • 2016-05-19
      • 2014-03-19
      相关资源
      最近更新 更多