XSL文件中如何在一个match模板内调用另一个match模板
问题核心原因
- 语法错误:XSLT不允许在模板内部嵌套定义另一个模板,你把
match="seconddto"的模板写在了firstdto模板内部,属于无效语法,不会被正常识别调用 - 路径错误:根节点
/下的直接子节点是<sites>,你直接调用select="firstdto"找不到对应节点,会返回空 - 大小写错误:XSLT标签大小写敏感,
<Xsl:template>要改为小写的<xsl:template> - 标签未闭合:
<xsl:value-of select="name">缺少闭合标签</xsl:value-of>
修复后的XSL代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <head> <style> ..... </style> </head> <body> <xsl:apply-templates select="sites/firstdto"/> </body> </xsl:template> <xsl:template match="firstdto"> <link><xsl:value-of select="link"/></link> <!-- 显式调用seconddto模板,指定节点路径 --> <xsl:apply-templates select="/sites/seconddto"/> <name><xsl:value-of select="name"/></name> </xsl:template> <xsl:template match="seconddto"> <link><xsl:value-of select="link"/></link> </xsl:template> </xsl:stylesheet>
代码说明
- 把
seconddto的模板移到firstdto模板外部,作为全局模板定义 - 在
firstdto模板内部通过绝对路径/sites/seconddto指定要调用的节点,执行对应模板就能拿到yahoo的link值 - 根模板里只需要调用
firstdto模板即可,不需要单独调用seconddto,符合你要在firstdto内部调用seconddto模板的需求 - 输出结果完全匹配你给出的预期格式
内容的提问来源于stack exchange,提问作者deepan
相关产品推荐
相关产品推荐

