我将为您设置一个示例,让您看到我的:
下面是我的xml:
<object>
<name>T3-A-blablabla</name>
</object>
<object>
<name>T3-A-blablabla</name>
</object>
<object>
<name>T3-B-blablabla</name>
</object>
<object>
<name>T2-A-blablabla</name>
</object>
<object>
<name>T2-A-blablabla</name>
</object>
这是我的for-each循环:
<xsl:for-each select="object[not(substring(name, '0', '6') = substring(preceding::object/name, '0', '6'))]">
<tr><td><xsl:value-of select="name"/></td></tr>
</xsl:for-each>
因此,我只想查找具有不同“类型”(T3-A-、T3-B-、T2-A-等等)的对象。
我的实际循环是这样的:
T3-A-blablabla
T3-B-blablabla
T2-A-blablabla
T2-A-blablabla
但我想要这样:
T3-A-blablabla
T3-B-blablabla
T2-A-blablabla
但是我的循环只排除了第一个对象,就好像前面没有检查所有可能与substring函数冲突的先例对象一样。希望你能帮助我,谢谢。
发布于 2018-08-03 01:12:00
对于此任务,您必须使用一种名为Muenchian Grouping
的技术。
将此设置应用于您的特定问题时,将使用组合键生成以下样式表/模板,在您的示例中,组合键是concat(substring-before(.,'-'),'-',substring-before(substring-after(.,'-'),'-'))
。
这个组合键将像T3-A-blablabla
这样的字符串简化为T3-A
,然后在Muenchian设置中用作xsl:key
的键。
<xsl:stylesheet version="1.0" ...
<xsl:key name="type" match="object" use="concat(substring-before(.,'-'),'-',substring-before(substring-after(.,'-'),'-'))"/>
...
<xsl:template match="/root">
<xsl:for-each select="object[generate-id() = generate-id(key('type',concat(substring-before(.,'-'),'-',substring-before(substring-after(.,'-'),'-')))[1])]">
<tr><td><xsl:value-of select="."/></td></tr>
</xsl:for-each>
</xsl:template>
...
</xsl:stylesheet>
当然,您必须用object
节点的实际上下文替换match="/root"
。
输出为
<?xml version="1.0"?>
<tr>
<td>
T3-A-blablabla
</td>
</tr><tr>
<td>
T3-B-blablabla
</td>
</tr><tr>
<td>
T2-A-blablabla
</td>
</tr>
https://stackoverflow.com/questions/51658550
复制相似问题