【问题标题】:How to use "two selfs" in XSLT XPath query?如何在 XSLT XPath 查询中使用“两个自我”?
【发布时间】:2014-01-16 21:48:15
【问题描述】:

这就是我想要做的:

<xsl:apply-templates select="live/file[not(deleted/file[@id=@id])]"/>

这显然行不通。这里的逻辑是我试图选择所有没有/deleted/file 元素的文件,其中@id 等于原始对象的@id。这是 XML:

<root>
  <live>
    <file id='a'/>
    <file id='b'/>
    <file id='c'/>
  </live>
  <deleted>
    <file id='b'/>
  </deleted>
</root>

问题是这个陈述是错误的:@id=@id,因为它们都在同一个轴上。

【问题讨论】:

    标签: xml xslt xpath xslt-2.0


    【解决方案1】:

    为了清晰和性能,我肯定会在这里使用键。

    <xsl:key name="deleted-ids" match="deleted/file" use="@id"/>
    

    然后

    <xsl:template match="live/file[not(key('deleted-ids', @id))]">
        [<xsl:value-of select="@id"/>]
    </xsl:template>
    

    【讨论】:

      【解决方案2】:

      用途:

      live/file[not(@id=../../deleted/file/@id)]
      

      【讨论】:

      • "live/file[not(@id=../../deleted/file/@id)]" 给出了预期的结果。 "live/file[not(../../deleted/file[@id=current()/@id])]" 将不起作用,因为"current()" 的含义在调用时已经不同.
      • 嗯?第二个版本对我来说很好。当然,您需要修改选择 file 元素的方式,但鉴于此,没关系。
      • 哦,呃,不应该在匹配模式中使用current(),即使某些处理器让它飞起来。我一直犯这个错误。将删除。
      【解决方案3】:

      我想你想要这样的东西:

      <xsl:apply-templates select="live/file[not(@id = ../../deleted/file/@id)]"/>
      

      但是,对于这种类型的匹配,使用 key 更好。

      【讨论】:

      • 这绝对行不通!= 执行存在比较。也就是说,当有 any deleted 文件与当前文件不匹配时,它将返回 true。因此,当有多个 deleted 项目时,它将返回所有内容。
      • 换句话说,它是在询问“是否存在存在一个没有当前@id的已删除文件”,这与询问“是不是no 已删除文件具有当前 @id" 的情况。这似乎只适用于给定的示例,但当有更多已删除的元素时会失败。
      • @lwburk 你是绝对正确的。我用 not() 对此进行了测试,并无意中粘贴了我之前因您提到的确切原因而丢弃的不工作的 != 版本。
      猜你喜欢
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 2017-03-07
      • 2022-12-14
      • 1970-01-01
      • 2011-11-01
      相关资源
      最近更新 更多