0
<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)"/>

这可能吗?如果可以,我将如何去做。任何帮助,将不胜感激。

谢谢

4

1 回答 1

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>
于 2013-02-04T20:39:12.283 回答