Xpath从一个节点中选择另一个节点中不存在的值

时间:2013-02-04 20:13:36

标签: xslt xpath muenchian-grouping node-set

<my-courses>
  <courses-reqd>
     <details> 
       <subject>Math</subject>
     </details>
     <details>
       <subject>Econ</subject>
     </details>
     <details>
       <subject>Geog</subject>
     </details> 
     <details>
       <subject>Phys</subject>
     </details>
     <detail>
       <subject>Zool</subject>
     </details>
  </courses-reqd>
  <courses-taken>
    <details> 
      <subject>Math</subject>
    </details>
    <details>
      <subject>Econ</subject>
    </details>
    <detail>
      <subject>Zool</subject>
    </details>
  </courses-taken>

我提供了示例XML,并希望知道如何获取不在课程中的值,而是使用XPATH获取课程中的值。在提供的案例中,答案将是Geog和Phys,因为它们在课程中不存在。

<xsl:apply-templates select="my-courses\courses-reqd | not(my-courses\courses-taken)"/>

这是否可行,如果是这样,我将如何做到这一点。任何帮助,将不胜感激。

由于

1 个答案:

答案 0 :(得分:0)

这里的简单答案就是这样做:

<xsl:apply-templates
   select="/my-courses/courses-reqd/detail
                [not(subject = /my-courses/courses/taken/details/subject)]" />

更好(更有效)的方法是使用密钥。

这将添加到XSLT的顶部:

<xsl:key name="kTaken" match="courses-taken//subject" use="."/>

然后,这将在您的一个模板中使用:

<xsl:apply-templates 
         select="/my-courses/courses-reqd/detail[not(key('kTaken', subject))]" />

在您的样本输入上运行此XSLT时(在更正样本输入后,始终使用名为“details”而非“detail”的元素:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:key name="kTaken" match="courses-taken//subject" use="."/>

  <xsl:template match="/">
    <root>
      <xsl:apply-templates 
          select="/my-courses/courses-reqd/details[not(key('kTaken', subject))]" />
    </root>
  </xsl:template>

  <xsl:template match="details">
    <course>
      <xsl:value-of select="subject"/>
    </course>
  </xsl:template>
</xsl:stylesheet>

结果是:

<root>
  <course>Geog</course>
  <course>Phys</course>
</root>