我有这样的XML:
<produits>
<produit>
<CAT>GENCABI</CAT>
<ITEMCODE>100-0190</ITEMCODE>
<DESCR>Broches Henry Schein Longueur 21Mm Taille 40</DESCR>
<EXTDESC>Broches Henry Schein Longueur 21Mm Taille 40</EXTDESC>
<ITEMSET>100-9231</ITEMSET>
<MANUF>1</MANUF>
<IMAGE>100-0190</IMAGE>
<TOC>8</TOC>
<SUBTOC>3</SUBTOC>
</produit>
<produit>
<CAT>GENCABI</CAT>
<ITEMCODE>100-0240</ITEMCODE>
<DESCR>Racleurs 25Mm No40 (6) Schein</DESCR>
<EXTDESC>Racleurs 25Mm No40 (6) Schein</EXTDESC>
<ITEMSET>100-9231</ITEMSET>
<MANUF>1</MANUF>
<IMAGE>100-0240</IMAGE>
<TOC>8</TOC>
<SUBTOC>3</SUBTOC>
</produit>
<produit>
<CAT>GENCABI</CAT>
<ITEMCODE>100-0379</ITEMCODE>
<DESCR>Finger Plugger Henry Schein 25Mm B</DESCR>
<EXTDESC>Pour condensation laterale de la gutta manche plastique. Rouge</EXTDESC>
<ITEMSET>100-8766</ITEMSET>
<MANUF>1</MANUF>
<IMAGE>100-8766</IMAGE>
<TOC>8</TOC>
<SUBTOC>9</SUBTOC>
</produit>
</produits>
我尝试按“Itemset”对Item进行分组。 我用xsl这样做:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes"/>
<xsl:key name="produit-by-ITEMSET" match="produit" use="ITEMSET" />
<xsl:template match="/produits">
<xsl:copy>
<xsl:apply-templates select="*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="produit">
<xsl:if test="generate-id() = generate-id(key('produit-by-ITEMSET', ITEMSET)[1])">
<produit>
<xsl:attribute name="ParentItem">
<xsl:value-of select="ITEMSET"/>
</xsl:attribute>
<xsl:for-each select="../produit[ITEMSET=current()/ITEMSET]">
<child>
<xsl:copy-of select="ITEMCODE" />
<xsl:copy-of select="DESCR" />
<xsl:copy-of select="EXTDESC" />
<xsl:copy-of select="MANUF" />
<xsl:copy-of select="IMAGE" />
</child>
</xsl:for-each>
</produit>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
我得到了我用多个“儿童”的项目所做的事情,但如果只有一个孩子,我想摆脱“儿童”标签。
在我看来,我有类似“如果计数(选择孩子)&gt; 1显示子标签,否则没有放置子标签”。但是我对xsl / xml很新,并且丢失了lillte ... 如果有人有提示......
编辑:添加xml输出我有&amp;我想要
我有输出:
<produits>
<produit ParentItem="100-9231">
<child>
<ITEMCODE>100-0190</ITEMCODE>
<DESCR>Broches Henry Schein Longueur 21Mm Taille 40</DESCR>
<EXTDESC>Broches Henry Schein Longueur 21Mm Taille 40</EXTDESC>
<MANUF>1</MANUF>
<IMAGE>100-0190</IMAGE>
</child>
<child>
<ITEMCODE>100-0583</ITEMCODE>
<DESCR>Broches Henry Schein Longueur 21Mm Taille 30</DESCR>
<EXTDESC>Broches Henry Schein Longueur 21Mm Taille 30</EXTDESC>
<MANUF>1</MANUF>
<IMAGE>100-0583</IMAGE>
</child>
<child>
<ITEMCODE>100-0720</ITEMCODE>
<DESCR>Broches Henry Schein Longueur 21 Mm Taille 15</DESCR>
<EXTDESC>Broches Henry Schein Longueur 21 Mm Taille 15</EXTDESC>
<MANUF>1</MANUF>
<IMAGE>100-0720</IMAGE>
</child>
</produit>
<produit ParentItem="968-2000">
<child>
<ITEMCODE>968-2000</ITEMCODE>
<DESCR>Aiguilles Medicales Terumo</DESCR>
<EXTDESC></EXTDESC>
<MANUF>5048</MANUF>
<IMAGE>968-2000</IMAGE>
</child>
</produit>
</produits>
我想要的输出:
<produits>
<produit ParentItem="100-9231">
<child>
<ITEMCODE>100-0190</ITEMCODE>
<DESCR>Broches Henry Schein Longueur 21Mm Taille 40</DESCR>
<EXTDESC>Broches Henry Schein Longueur 21Mm Taille 40</EXTDESC>
<MANUF>1</MANUF>
<IMAGE>100-0190</IMAGE>
</child>
<child>
<ITEMCODE>100-0583</ITEMCODE>
<DESCR>Broches Henry Schein Longueur 21Mm Taille 30</DESCR>
<EXTDESC>Broches Henry Schein Longueur 21Mm Taille 30</EXTDESC>
<MANUF>1</MANUF>
<IMAGE>100-0583</IMAGE>
</child>
<child>
<ITEMCODE>100-0720</ITEMCODE>
<DESCR>Broches Henry Schein Longueur 21 Mm Taille 15</DESCR>
<EXTDESC>Broches Henry Schein Longueur 21 Mm Taille 15</EXTDESC>
<MANUF>1</MANUF>
<IMAGE>100-0720</IMAGE>
</child>
</produit>
<produit ParentItem="968-2000">
<ITEMCODE>968-2000</ITEMCODE>
<DESCR>Aiguilles Medicales Terumo</DESCR>
<EXTDESC></EXTDESC>
<MANUF>5048</MANUF>
<IMAGE>968-2000</IMAGE>
</produit>
</produits>
答案 0 :(得分:1)
我猜你想要你的输出看起来像这样......
<produits>
<produit ParentItem="100-9231">
<child>
<ITEMCODE>100-0190</ITEMCODE>
<DESCR>Broches Henry Schein Longueur 21Mm Taille 40</DESCR>
<EXTDESC>Broches Henry Schein Longueur 21Mm Taille 40</EXTDESC>
<MANUF>1</MANUF>
<IMAGE>100-0190</IMAGE>
</child>
<child>
<ITEMCODE>100-0240</ITEMCODE>
<DESCR>Racleurs 25Mm No40 (6) Schein</DESCR>
<EXTDESC>Racleurs 25Mm No40 (6) Schein</EXTDESC>
<MANUF>1</MANUF>
<IMAGE>100-0240</IMAGE>
</child>
</produit>
<produit ParentItem="100-8766">
<ITEMCODE>100-0379</ITEMCODE>
<DESCR>Finger Plugger Henry Schein 25Mm B</DESCR>
<EXTDESC>Pour condensation laterale de la gutta manche plastique. Rouge</EXTDESC>
<MANUF>1</MANUF>
<IMAGE>100-8766</IMAGE>
</produit>
</produits>
首先要提到的是, xsl:for-each 实际上可以使用密钥来获取“群组”中的“子”项
<xsl:for-each select="key('produit-by-ITEMSET', ITEMSET)">
为避免重复代码,我会创建一个模板来输出子项(不包括子元素)
<xsl:template match="produit" mode="child">
<xsl:copy-of select="ITEMCODE" />
<xsl:copy-of select="DESCR" />
<xsl:copy-of select="EXTDESC" />
<xsl:copy-of select="MANUF" />
<xsl:copy-of select="IMAGE" />
</xsl:template>
然后,您可以通过计算密钥
来测试有多少子项 <xsl:choose>
<xsl:when test="count(key('produit-by-ITEMSET', ITEMSET)) > 1">
<!-- Multiple children -->
</xsl:when>
<xsl:otherwise>
<-- One child -->
</xsl:otherwise>
</xsl:choose>
对于多个孩子,使用当前for-each循环,但调用模板
<xsl:for-each select="key('produit-by-ITEMSET', ITEMSET)">
<child>
<xsl:apply-templates select="." mode="child" />
</child>
</xsl:for-each>
对于单个孩子,只需在不创建孩子的情况下调用模板。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes"/>
<xsl:key name="produit-by-ITEMSET" match="produit" use="ITEMSET" />
<xsl:template match="/produits">
<xsl:copy>
<xsl:apply-templates select="*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="produit">
<xsl:if test="generate-id() = generate-id(key('produit-by-ITEMSET', ITEMSET)[1])">
<produit>
<xsl:attribute name="ParentItem">
<xsl:value-of select="ITEMSET"/>
</xsl:attribute>
<xsl:choose>
<xsl:when test="count(key('produit-by-ITEMSET', ITEMSET)) > 1">
<xsl:for-each select="key('produit-by-ITEMSET', ITEMSET)">
<child>
<xsl:apply-templates select="." mode="child" />
</child>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="." mode="child" />
</xsl:otherwise>
</xsl:choose>
</produit>
</xsl:if>
</xsl:template>
<xsl:template match="produit" mode="child">
<xsl:copy-of select="ITEMCODE" />
<xsl:copy-of select="DESCR" />
<xsl:copy-of select="EXTDESC" />
<xsl:copy-of select="MANUF" />
<xsl:copy-of select="IMAGE" />
</xsl:template>
</xsl:stylesheet>