如何在for-each循环中找到与xslt属性值匹配的元素

jos*_*sch 3 xml xslt

假设我有以下XML:

<data>
  <foos>
    <foo id="1" checked="yes" />
    <foo id="2" />
    <foo id="3" />
    <foo id="4" checked="yes" />
  </foos>
  <bars>
    <bar for="1" name="blub" />
    <bar for="2" name="bla" />
    <bar for="3" name="baz" />
    <bar for="4" name="plim" />
  </bars>
</data>
Run Code Online (Sandbox Code Playgroud)

现在我想打印name那些bar指向foo具有该属性的元素的元素的所有属性checked.所以对于上面的例子,我的xslt会输出blubplim.

到目前为止,我所尝试的只是检查是否可以打印每个id属性所属的foo元素的属性bar:

<xsl:template match="/">
  <xsl:for-each select="//bars/bar">
    <xsl:value-of select="../../foos/foo[@id=./@for]/@id" />
  </xsl:for-each>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

但无济于事.我认为问题是,该检查foo[@id=./@for]将同时选择@id@forfoo元素.那么我怎么能说我想要@for来自for循环当前元素的属性,而不是@id来自另一个当前元素?

Ian*_*rts 5

我怎么能说我想要@forfor循环中当前元素的属性,但是@id来自其他当前元素?

使用current()功能:

<xsl:value-of select="../../foos/foo[@id=current()/@for]/@id" />
Run Code Online (Sandbox Code Playgroud)

在方括号内,.是谓词正在测试current()的节点,而是作为当前目标的节点for-each.