Xml XSL Muenchian分组和筛选
情况是这样的: 我有一家商店,出售两家生产商a公司和B公司的家具,还从一家进口商C公司进口家具 我的文件看起来像这样Xml XSL Muenchian分组和筛选,xml,xslt,muenchian-grouping,Xml,Xslt,Muenchian Grouping,情况是这样的: 我有一家商店,出售两家生产商a公司和B公司的家具,还从一家进口商C公司进口家具 我的文件看起来像这样 <shop> <product> <name>Chair</name> <colour>Green</colour> <producer>CompanyA</producer> </product> &
<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>
椅子
绿色
公司
椅子
绿色
公司b
椅子
蓝色
公司
椅子
蓝色
公司
桌子
绿色
公司
桌子
绿色
公司
桌子
蓝色
公司b
桌子
蓝色
公司
我想减少库存,所以我需要一份a公司和C公司类似产品的清单。我不想列出a公司和B公司的类似产品,也不想列出B公司和C公司的类似产品。
期望的输出是这样的
<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>
一种方法是将现有的
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>