XSLT中apply-templates为何输出不匹配节点的多余文本内容?
问题根源
你遇到的多余文本输出是XSLT内置默认模板规则导致的:
- 当你调用无
select属性的<xsl:apply-templates/>时,会递归处理当前节点(根节点)下的所有子节点 - 对于没有自定义匹配模板的节点,XSLT会触发默认规则:
- 元素/根节点:自动递归处理所有子节点
- 文本节点:直接输出节点内容
你没有为<Data>、<getGender>、<get_Gender>这些节点定义匹配模板,所以内置规则会递归到<get_Gender>下的文本节点,直接把male输出到结果中,再加上你后续主动写的<Feature name="gender">取的//get_Gender值,就出现了重复的male文本。
解决方案
选以下任意一种修改方式即可:
- 限定apply-templates的处理范围
把根模板里的<xsl:apply-templates/>改为仅匹配你需要处理的Value节点:
<xsl:apply-templates select="//Value"/>
这样就只会处理你写了自定义模板的Value元素,不会触碰<Data>分支下的内容。
- 添加空模板屏蔽不需要的节点输出
在样式表中添加规则,跳过不需要输出的节点内容:
<!-- 方式2-1:直接跳过Data节点的所有处理 --> <xsl:template match="Data"/> <!-- 方式2-2:屏蔽所有无匹配模板的文本节点输出,适合不需要额外默认文本输出的场景 --> <xsl:template match="text()"/>
修改后即可得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者GDF-WebDev
相关产品推荐
相关产品推荐

