为什么我的xml查询不起作用

时间:2015-01-08 15:15:08

标签: xml xslt querying

我需要从XML文件中查询(我在这里包含) Link towards the xml file
我需要找到所有具有课程先决条件的课程,这些课程名为“埃里克”'

预期查询结果:

  1. 编程抽象
  2. 计算机组织与系统
  3. 计算机科学家概率简介
  4. 数字系统II
  5. 我尝试按步骤

    工作

    我知道我需要找到所有具有先决条件的课程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. Digital Systems II
    4. 如果我尝试

      <?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. 编程抽象
      2. 所以我可以假设我的&#34;和&#34;不工作?

1 个答案:

答案 0 :(得分: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&#39; &#39; CS106B&#39;作为先决条件。但显然上面的键查找解决了实际需求。

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

重新:更多要求

嗯,你可以内联密钥,但它变得更难理解,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])"/>