XSLT:对于每个带有XPath的2个条件

时间:2017-03-23 09:42:34

标签: xml xslt xpath

我的问题:两个条件都必须为真,并且必须在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] ">

1 个答案:

答案 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>