2012-12-20 37 views
1

匹配我想XSL分組與通配符

<Sets> 
    <Set id="category.product.typeA.item1"/> 
    <Set id="category.product.typeB.item2"/> 
    <Set id="category.product.typeC.item3"/> 
    <Set id="category.product.typeA.item2"/> 
    <Set id="category.product.typeA.item3"/> 
    <Set id="category.service.typeA.item1"/> 
    <Set id="category.service.typeA.item2"/> 
    <Set id="category.product.typeA.item4"/> 
    <Set id="category.product.typeA.item5"/> 
</Sets> 

變換這個XML片段插入到下面的XML片斷:

<Category id="category.product"> 
    <Group id="category.product.typeA"> 
     <Set id="category.product.typeA.item1"/> 
     <Set id="category.product.typeA.item2"/> 
     <Set id="category.product.typeA.item3"/> 
     <Set id="category.product.typeA.item4"/> 
     <Set id="category.product.typeA.item5"/>   
    </Group> 
    <Group id="category.product.typeB"> 
     <Set id="category.product.typeB.item2"/> 
    </Group> 
    <Group id="category.product.typeC"> 
     <Set id="category.product.typeC.item3"/> 
    </Group> 
</Category> 
<Category id="category.service"> 
    <Group id="category.service.typeA"> 
     <Set id="category.service.typeA.item1"/> 
     <Set id="category.service.typeA.item2"/> 
    </Group> 
</Category> 

基本上,我想放元件根據屬性值分成不同的組。

因此,具有屬性值的元素相匹配的:。 category.product.typeA *應放在一組 category.product.typeB *應放在另一組

如果值了屬性匹配category.product。*該組應放在一個類別中,如果該屬性的值匹配category.service。*,則應將其放在另一個類別中。

我已經爲「starts-with」和「for-each-group」做了努力,但是我無法將這些元素的組合和通配符匹配放在一起,並希望得到任何幫助。

回答

1

這裏是我的建議:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:mf="http://example.com/mf" 
    exclude-result-prefixes="xs mf" 
    version="2.0"> 

<xsl:output indent="yes"/> 

<xsl:template match="Sets"> 
    <xsl:for-each-group select="Set" group-by="string-join(tokenize(@id, '\.')[position() lt 3], '.')"> 
    <Category id="{current-grouping-key()}"> 
     <xsl:for-each-group select="current-group()" group-by="string-join(tokenize(@id, '\.')[position() lt 4], '.')"> 
     <Group id="{current-grouping-key()}"> 
      <xsl:copy-of select="current-group()"/> 
     </Group> 
     </xsl:for-each-group> 
    </Category> 
    </xsl:for-each-group> 
</xsl:template> 

</xsl:stylesheet> 

當我申請的是樣式與撒克遜9.4到你輸入我得到了想要的結果

<Category id="category.product"> 
    <Group id="category.product.typeA"> 
     <Set id="category.product.typeA.item1"/> 
     <Set id="category.product.typeA.item2"/> 
     <Set id="category.product.typeA.item3"/> 
     <Set id="category.product.typeA.item4"/> 
     <Set id="category.product.typeA.item5"/> 
    </Group> 
    <Group id="category.product.typeB"> 
     <Set id="category.product.typeB.item2"/> 
    </Group> 
    <Group id="category.product.typeC"> 
     <Set id="category.product.typeC.item3"/> 
    </Group> 
</Category> 
<Category id="category.service"> 
    <Group id="category.service.typeA"> 
     <Set id="category.service.typeA.item1"/> 
     <Set id="category.service.typeA.item2"/> 
    </Group> 
</Category> 
+0

非常感謝您!我從未想過「標記化」,但我一定會將標記化添加到我的「xsl工具箱」中。 – Gunilla