使用XSL交叉引用统计匹配节点数量的技术咨询
解决XSL统计关联术语数量并输出名称的问题
我来帮你调整现有的XSL样式表,让它既能输出关联的术语名称,又能精准统计对应类型desc的术语总数。针对你给出的XML结构和需求,我们可以这样修改:
修改后的XSL代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <!-- 开启缩进让输出结构更清晰 --> <!-- 保留原有的key,用于通过concept的ID匹配对应的节点 --> <xsl:key name = "terms" match = "desc[@type = 'concept']" use = "ID"/> <xsl:template match="/"> <!-- 这里指定要统计的目标类型,比如type="a";如果要处理所有非concept类型,改成@type != 'concept'即可 --> <xsl:apply-templates select = "rdf/desc[@type != 'concept' and @type = 'a']"/> </xsl:template> <xsl:template match = "desc"> <association> <!-- 输出当前desc的类型标识 --> <desc-type><xsl:value-of select="@type"/></desc-type> <!-- 获取与当前desc关联的所有concept节点 --> <xsl:variable name = "matching-concepts" select = "key('terms', substring(concept/@ID, 2))"/> <!-- 统计关联的术语总数:遍历所有匹配concept下的term节点并计数 --> <total-terms><xsl:value-of select="count($matching-concepts/term)"/></total-terms> <!-- 列出所有关联的术语名称 --> <terms> <xsl:for-each select="$matching-concepts/term/info"> <term-name><xsl:value-of select="name/text()"/></term-name> </xsl:for-each> </terms> </association> </xsl:template> </xsl:stylesheet>
代码关键说明
- 灵活匹配目标类型:根模板的
select条件可以按需调整,比如要同时处理type="a"和type="b",直接改成rdf/desc[@type != 'concept']即可。 - 统计术语数量:用
count($matching-concepts/term)直接统计所有关联concept节点下的term总数,这会自动累加同一concept下的多个term(比如你的示例中type="a"对应2个术语)。 - 结构化输出:把类型、数量、术语名称分别放在不同节点下,输出的XML结构更清晰易读,也方便后续处理。
测试输出结果
针对你提供的XML,运行修改后的样式表后,type="a"的desc会输出如下内容:
<association> <desc-type>a</desc-type> <total-terms>2</total-terms> <terms> <term-name>apple</term-name> <term-name>pear</term-name> </terms> </association>
如果改成处理所有非concept类型,还会输出type="b"的统计结果(总数1,术语chocolate)。
内容的提问来源于stack exchange,提问作者Sean2148
相关产品推荐
相关产品推荐

