【问题标题】:why is my xml Query not working为什么我的 xml 查询不起作用
【发布时间】:2015-01-08 15:15:07
【问题描述】:

我需要从一个 XML 文件中查询(我在这里包含) Link towards the xml file
我需要找到所有具有“Eric”教授所提供课程先决条件的课程

预期的查询结果:

  1. 编程抽象
  2. 计算机组织和系统
  3. 计算机科学家概率简介
  4. 数字系统二

我尝试按步骤工作

我知道我需要找到所有具有 CS106A 和 CS106B 前提条件的课程

所以我尝试了

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<Course_Catalog>
  <xsl:copy-of select="//Course[Prerequisites/Prereq = 'CS106B' and 'CS106A']/Title"/>
</Course_Catalog>
</xsl:template>
</xsl:stylesheet>

但这给了我

  1. 计算机组织和系统
  2. 计算机科学家概率简介
  3. 数字系统 II

如果我尝试

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<Course_Catalog>
  <xsl:copy-of select="//Course[Prerequisites/Prereq = 'CS106A' and 'CS106B']/Title"/>
</Course_Catalog>
</xsl:template>
</xsl:stylesheet>

我只得到

  1. 编程抽象

所以我可以假设我的“和”不起作用?

【问题讨论】:

  • 您不应该写关于“XML 查询”(听起来更像 XQuery)——“XPath 表达式”是正确的术语。如果您打算引用上面的整个代码块 - 这称为 XSLT 样式表

标签: xml xslt querying


【解决方案1】:

编辑、重新查找以教授名字为先决条件的课程

您可以使用xsl:key 创建索引查找,并将其用作模板中的谓词:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:key name="ProfLookup"
           match="//Course"
           use="@Number"/>

  <xsl:template match="/">
    <CoursesWithPrerequsiteOfEric>
      <xsl:apply-templates select="//Course[key('ProfLookup', 
          Prerequisites/Prereq)/Instructors/Professor/First_Name='Eric']"/>
    </CoursesWithPrerequsiteOfEric>
  </xsl:template>

  <xsl:template match="Course">
    <Course>
      <xsl:value-of select="Title"/>
    </Course>
  </xsl:template>

</xsl:stylesheet>

吐出来:

<CoursesWithPrerequsiteOfEric>
  <Course>Programming Abstractions</Course>
  <Course>Computer Organization and Systems</Course>
  <Course>Introduction to Probability for Computer Scientists</Course>
  <Course>Digital Systems II</Course>
</CoursesWithPrerequsiteOfEric>

编辑

很抱歉没有先了解最初的要求。您的中间步骤当然是找到所有以“CS106A”“CS106B”为先决条件的课程。但是显然上面的key lookup解决了实际的需求。

<xsl:template match="/">
 <CoursesWithPrerequsiteOfEric>
   <xsl:apply-templates select="//Course[Prerequisites/Prereq = 'CS106A' or
                                         Prerequisites/Prereq = 'CS106B']"/>
 </CoursesWithPrerequsiteOfEric>
</xsl:template>

Re:更多要求

好吧,你可以内联密钥,但它变得更难理解,IMO:

select="//Course[Prerequisites/Prereq = //Course[Instructors/Professor/First_Name='Eric']/@Number]"

然后重新计算 - 您需要更新您的 xsl functions

<xsl:value-of select="count(//Course[Prerequisites/Prereq = //Course[Instructors/Professor/First_Name='Eric']/@Number])"/>

【讨论】:

  • 感谢您查看我的问题@StuartLC 我实际上需要做的是找到所有课程,这些课程具有由 Eric 的名字教授的课程的先决条件,这将是 CS106A 和 CS106B 总共将给出 4 门课程的结果(参见:预期查询结果)
  • 效果很好@StuartLC,只有我需要在没有关键未来的情况下这样做,我的最后一步是获取一个值,所以我的最后一步是计数?我的课程/标题获得 4
  • @taine 已更新,欢迎来到 StackOverflow。将来,请在前面完整说明问题 - 例如对允许的语法的限制,并避免之后添加新的要求(如计数)。祝你好运!
  • 谢谢,@StuartLC 的解决方案,@ 创建这个的目的是我想一步一步地完成这个,但我很 很高兴 你对完成这个的投入问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
相关资源
最近更新 更多