您可以做的是首先匹配第一个 XML 文档中数据元素的子元素
<xsl:template match="datas/*">
然后将元素的“类型”和“位置”提取到变量中
<xsl:variable name="type" select="substring(local-name(), 1, 4)" />
<xsl:variable name="position" select="number(substring(local-name(), 5))" />
最后,您可以在第二个文档(在我的示例中将其称为“test2.xml”)中查找相关名称,如下所示:
<xsl:apply-templates select="document('test2.xml')/results/result[type=$type][position()=$position]/value/text()" />
这是完整的 XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="datas/*">
<xsl:variable name="type" select="substring(local-name(), 1, 4)" />
<xsl:variable name="position" select="number(substring(local-name(), 5))" />
<xsl:copy>
<xsl:apply-templates select="document('test2.xml')/results/result[type=$type][position()=$position]/value/text()" />
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
当应用于您的输入 XML 时,应输出以下内容
<datas>
<data1>john</data1>
<data2>tom</data2>
<data3>john</data3>
<name1>marc</name1>
<name2>marc</name2>
</datas>
编辑:正如 Martin Honnen 在评论中正确指出的那样(谢谢 Martin!),这最好用钥匙来实现。首先像这样定义一个键:
<xsl:key name="lookup" match="result" use="type" />
然后你可以像这样从第二个文档中查找文本:
<xsl:apply-templates
select="key('lookup', $type, document('test2.xml'))[$position]/value/text()" />
这个 XSLT 也应该可以工作(在 XSLT 2.0 中)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="lookup" match="result" use="type" />
<xsl:template match="datas/*">
<xsl:variable name="type" select="substring(local-name(), 1, 4)" />
<xsl:variable name="position" select="number(substring(local-name(), 5))" />
<xsl:copy>
<xsl:apply-templates
select="key('lookup', $type, document('test2.xml'))[$position]/value/text()" />
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>