我的问题:两个条件都必须为真,并且必须在SAME节点上运行2次检查(我通过//选择一堆节点)
目前我通过使用新的书籍/作者将节点留在每个节点中,但是如果我把它拿出来(例如我在代码下面想象的那样)它给了我一个错误。 有什么帮助吗?
<xsl:for-each select="//node">
<routes>
<xsl:variable name="origin" select="@origin"/>
<xsl:variable name="dest" select="@dest"/>
Origin: <xsl:value-of select="$origin"/>
Dest: <xsl:value-of select="$dest"/>
<xsl:for-each select="//books/authors [substring-before(../../@name, '.') = $origin] | //books/authors [substring-before(../../@name, '.') = $dest] ">
</xsl:for-each>
我是怎么想象的,所以它在同一个节点上运行,但它输出了一个错误
<xsl:for-each select="//books/authors [substring-before(../../@name, '.') = $origin] | //books/authors [substring-before(../../@name, '.') = $dest] ">
答案 0 :(得分:2)
我认为您正在寻找的语法就是这个..
<xsl:for-each select="//books/authors[substring-before(../../@name, '.') = $origin and substring-before(../../@name, '.') = $dest] ">
....
</xsl:for-each>
这也可行......
<xsl:for-each select="//books/authors[substring-before(../../@name, '.') = $origin][substring-before(../../@name, '.') = $dest] ">
....
</xsl:for-each>
请注意../../
获得&#34; grand-parent&#34; authors
节点,所以你也可以重写这个条件...(虽然你可以用实际的元素名称替换通用的*
<xsl:for-each select="//*[substring-before(@name, '.') = $origin and substring-before(@name, '.') = $dest]/books/authors">
</xsl:for-each>