【问题标题】:XSLT 1.0: selecting based on attribute of preceding siblings of current() nodeXSLT 1.0:基于 current() 节点的先前兄弟节点的属性进行选择
【发布时间】:2016-04-26 20:00:20
【问题描述】:

我有一个基本的 xml 文件,例如:

<base>
     ...
     <s l="something" />
     <s l="somethingelse" />
     <s>
     ...
</base>

在我的 xslt 中,我使用每个 &lt;s&gt; 上的 document() 函数来拉入另一个结构如下的文件:

<otherbase>
     ...
     <r l="something" />
     <r l="somethingelse" />
     <r l="evenmore" />
     ...
</otherbase>

在基本文件中的&lt;s&gt; 处,我试图选择所有&lt;r&gt;s,其@l 与当前&lt;s&gt;任何 preceding-sibling::*/@l 不匹配。因此对于没有属性的第三个&lt;s&gt;,它将匹配&lt;r l="evenmore" /&gt;等。

类似:

<xsl:for-each select="document('mydoc.xml')//r[@l != preceding-sibling::*/@l]"> 
     ...
</xsl:for-each>

如果我在我相信的&lt;r&gt; 属性中匹配,我会工作,但我需要current() 的前兄弟姐妹......我无法弄清楚语法。

不幸的是,我的环境中没有 2.0 处理器,卡在 xslt 1.0 中。

【问题讨论】:

  • 我更改了你的标题,因为你的问题与模式匹配无关。

标签: xslt xpath xslt-1.0


【解决方案1】:

当您想在谓词中引用当前的s 节点时,您需要使用current() 函数。试试:

select="document('mydoc.xml')//r[not(@l = current()/preceding-sibling::s/@l)]"

还要注意$a != $bnot($a = $b) 之间的区别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多