Xslt 基于与通配符匹配的属性值对元素进行XSL分组
我想转换这个xml片段Xslt 基于与通配符匹配的属性值对元素进行XSL分组,xslt,Xslt,我想转换这个xml片段 <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="categ
<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片段:
<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.*匹配,则应将其放入另一个类别
我已经在“开始于”和“针对每个组”方面做出了努力,但我无法将元素的分组和属性的通配符匹配放在一起,我希望能得到任何帮助。以下是我的建议:
<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>
当我将带有Saxon 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>
以下是我的建议:
<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>
当我将带有Saxon 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>
非常感谢!我从来没有想过“tokenize”,但我肯定会将tokenize添加到我的“xsl工具箱”中。非常感谢!我从未想过“tokenize”,但我肯定会将tokenize添加到我的“xsl工具箱”中。