如何在单个XSLT文件中使用两个XML文件并通过嵌套模板提取目标值
XSLT按顺序提取字段的实现方法
原有代码问题
- XSLT 规范不允许在
<xsl:template>内部嵌套定义另一个模板,所有<xsl:template>必须是<xsl:stylesheet>的直接子节点,你嵌套写seconddto模板的写法本身属于语法错误,无法正常执行。 - 标签大小写错误:XSLT 标签大小写敏感,
<Xsl:template>的写法不符合规范,必须统一为小写<xsl:template>。 - 标签未闭合:
<xsl:value-of select="name">缺少闭合标记/>。
正确实现方案
你需要的输出逻辑不需要所谓的“嵌套模板匹配”,直接在firstdto的处理模板中通过XPath寻址获取seconddto的对应字段即可,作用域会保持当前firstdto的上下文,符合你的预期。
场景1:单XML文件同时包含firstdto和seconddto节点
假设你的源XML根节点为root,结构如下:
<root> <firstdto> <name>google</name> <url>google.com</url> </firstdto> <seconddto> <name>yahoo</name> <url>yahoo.com</url> </seconddto> </root>
对应的XSLT代码:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <xsl:apply-templates select="root/firstdto"/> </xsl:template> <xsl:template match="firstdto"> <!-- 输出First.xml的url --> <xsl:value-of select="url"/> <xsl:text>
</xsl:text> <!-- 输出Second.xml的url,用绝对路径寻址seconddto节点 --> <xsl:value-of select="/root/seconddto/url"/> <xsl:text>
</xsl:text> <!-- 输出当前firstdto的name,上下文保持有效 --> <xsl:value-of select="name"/> </xsl:template> </xsl:stylesheet>
场景2:firstdto和seconddto分属两个独立XML文件
如果seconddto存放在独立的Second.xml中,使用document()函数加载外部文件即可:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <xsl:apply-templates select="firstdto"/> </xsl:template> <xsl:template match="firstdto"> <xsl:value-of select="url"/> <xsl:text>
</xsl:text> <!-- 加载外部Second.xml文件,取seconddto的url字段 --> <xsl:value-of select="document('Second.xml')/seconddto/url"/> <xsl:text>
</xsl:text> <xsl:value-of select="name"/> </xsl:template> </xsl:stylesheet>
内容的提问来源于stack exchange,提问作者deepan
相关产品推荐
相关产品推荐

