如何使用XSLT统计包含特定文本节点的XML元素数量
用XSLT统计包含特定文本的元素数量
假设你的PetShop XML结构大概是这样的:
<PetShop> <Cage> <Occupant1>Parrot</Occupant1> <Occupant2>Monkey</Occupant2> </Cage> <Cage> <Occupant1>Monkey</Occupant1> <Occupant2>Parrot</Occupant2> </Cage> <Cage> <Occupant1>Parrot</Occupant1> <Occupant2>Parrot</Occupant2> </Cage> </PetShop>
下面提供几种针对性的统计方案,你可以根据需求选择:
方案1:精确匹配目标文本
如果要统计所有文本内容完全等于指定值的Occupant1/Occupant2元素总数,用这段XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <!-- 可修改的目标文本参数 --> <xsl:param name="targetText" select="'Parrot'"/> <xsl:template match="/"> <!-- 核心统计逻辑:定位元素 + 筛选文本 + 计数 --> <xsl:value-of select="count(//*[local-name()='Occupant1' or local-name()='Occupant2'][text()=$targetText])"/> </xsl:template> </xsl:stylesheet>
代码说明:
//*[local-name()='Occupant1' or local-name()='Occupant2']:定位到所有名为Occupant1或Occupant2的元素[text()=$targetText]:筛选出文本内容精确匹配$targetText的元素count(...):计算符合条件的元素总数
用上面的示例XML测试,会输出4(一共4个文本为Parrot的元素)。
方案2:模糊匹配(包含目标文本)
如果需要统计文本中包含指定内容的元素(比如文本是Blue Parrot也能被匹配),只需要把筛选条件改成:
count(//*[local-name()='Occupant1' or local-name()='Occupant2'][contains(text(), $targetText)])
方案3:按Cage分组统计
要是想知道每个笼子里有多少个目标元素,可以遍历每个Cage单独统计:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:param name="targetText" select="'Parrot'"/> <xsl:template match="/PetShop"> <xsl:for-each select="Cage"> Cage <xsl:value-of select="position()"/>: <xsl:value-of select="count(*[local-name()='Occupant1' or local-name()='Occupant2'][text()=$targetText])"/> <xsl:text> </xsl:text> <!-- 换行符,让输出更清晰 --> </xsl:for-each> <xsl:text>Total: </xsl:text> <xsl:value-of select="count(//*[local-name()='Occupant1' or local-name()='Occupant2'][text()=$targetText])"/> </xsl:template> </xsl:stylesheet>
运行后会输出:
Cage 1: 1 Cage 2: 1 Cage 3: 2 Total: 4
你可以根据实际的匹配规则和输出需求调整代码,这些方案都能很好地完成统计任务。
内容的提问来源于stack exchange,提问作者hglocke
相关产品推荐
相关产品推荐

