我正在尝试将循环中当前元素的属性与所有其他属性进行比较。我不确定我是否做对了,所以这是我的尝试
这是XML文件:
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="sample.xsd">
<foo>
<subfoo id="123">Foo 1</subfoo>
<subfoo id="345">Foo 2</subfoo>
<subfoo id="678">Foo 3</subfoo>
</foo>
<bar id="U123">
<subbar>Hello World</subbar>
</bar>
<bar id="345">
<subbar>Hello Other World</subbar>
</bar>
<bar id="912">
<subbar>Hello 3rd World</subbar>
</bar>
</root>
这是XSLT文件:
<xsl:template match="root">
<xsl:variable name="subfoo" select="root/foo/subfoo"/>
<xsl:variable name="subbar" select="root/bar"/>
<xsl:for-each select="$subfoo">
<xsl:variable name="subfooID" select="./@id"/>
<xsl:for-each select="$subbar">
<xsl:if test="$subfooID = ./@id">
<xsl:if test="./@id[current()] = @id">
<xsl:value-of select="subfoo"/> Matches <xsl:value-of select="subbar"/>
</xsl:if>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
如果两个ID匹配,则输出应显示类似
Foo 1 Matches Hello World
Foo 2 Matches Hello Other World
有人可以帮我找到我在这里想念的东西吗? 问候。
答案 0 :(得分:2)
我只需要为交叉引用定义一个键,然后处理存在交叉引用的元素:
<iframe src='https://webchat.botframework.com/embed/{BotId_HERE}?s={YOUR_SECRET_HERE}&userid={Your_userid_HERE}' width="300px" height="450px"></iframe>
https://xsltfiddle.liberty-development.net/94hvTzo
在尝试中,您遇到了很多错误的路径,因为您似乎不知道<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="text"/>
<xsl:key name="bar" match="bar" use="@id"/>
<xsl:template match="root">
<xsl:apply-templates select="foo/subfoo[key('bar', @id)]"/>
</xsl:template>
<xsl:template match="subfoo">
<xsl:value-of select="concat(., ' matches ', key('bar', @id)/subbar, ' ')"/>
</xsl:template>
</xsl:stylesheet>
或xsl:template
会更改上下文,因此您需要更改例如xsl:for-each
至select="root/foo/subfoo"
。