Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
xslt和xpath:匹配两个节点属性_Xslt - Fatal编程技术网

xslt和xpath:匹配两个节点属性

xslt和xpath:匹配两个节点属性,xslt,Xslt,给定以下xml: <student studentID="001"> <dateOfBirth> 1-1-1990 </dateOfBirth> <name> Ayse Ozer </name> <sex> F </sex> <takes> CMPE351 </takes> <takes> CMPE111 </takes>

给定以下xml:

<student studentID="001"> 
    <dateOfBirth> 1-1-1990 </dateOfBirth>
    <name> Ayse Ozer </name>
    <sex> F </sex>
    <takes> CMPE351 </takes>
    <takes> CMPE111 </takes>
<takes> CMPE418 </takes>
 </student>

 <student studentID="002"> 
    <dateOfBirth> 2-2-1992 </dateOfBirth>
    <name> Bircan Korkmaz </name>
    <sex> F </sex>
    <takes> CMPE418 </takes>
    <takes> CMPE111 </takes>
<takes> CMPE352 </takes>
    </student>

<course courseCode="CMPE351">
     <courseName>
           Database systems I
     </courseName>
     <description>
         First course in databases
     </description>       
 </course>

 <course courseCode="CMPE111">
     <courseName>
           Introduction to C
     </courseName>
     <description>
         First course in programming
     </description>       
 </course>

 <course courseCode="CMPE352">
     <courseName>
           Database systems II
     </courseName>
     <description>
         Second course in databases
     </description>       
 </course>

 <course courseCode="CMPE418">
     <courseName>
           Internet Programming
     </courseName>
     <description>
         Programming for the Internet.
     </description>       
 </course>

我编写了以下xsl代码:

<xsl:template match = "school">
<head>
<title>Student</title>    
 </head>
 <body>
 <p>Courses Taken By Students:</p>
   <xsl:for-each select = "student">
 <ul>
 <li><xsl:value-of select = "name"/> </li>    
 <xsl:for-each select = "takes">
 <ul>
 <li><xsl:value-of select="text()" />
<xsl:value-of select = "../../course[@courseCode=text()]/courseName"/> </li>
 </ul> 
</xsl:for-each>
 </ul>  
    </xsl:for-each>
 </body>
 </xsl:template>

学生
学生修读的课程:

* Ayse Ozer
      o CMPE351 Database systems I
      o CMPE111 Introduction to C
* Bircan Korkmaz
      o CMPE418 Internet Programming
      o CMPE111 Introduction to C


关于文本()上一行的问题

问题在于空格:

<takes> CMPE351 </takes>
CMPE351
应该是:

<takes>CMPE351</takes>
CMPE351
我会尽力补偿。。。路上的例子。。。 为了避免很多问题(并提高性能),我还将使用xsl索引


修正(警告-它不适用于中间有多个空格的课程代码,但这似乎不太可能):


使用(位于顶部)xsl索引:

<xsl:key name="courses" match="/school/course" use="@courseCode"/>

问题在于空格:

<takes> CMPE351 </takes>
CMPE351
应该是:

<takes>CMPE351</takes>
CMPE351
我会尽力补偿。。。路上的例子。。。 为了避免很多问题(并提高性能),我还将使用xsl索引


修正(警告-它不适用于中间有多个空格的课程代码,但这似乎不太可能):


使用(位于顶部)xsl索引:

<xsl:key name="courses" match="/school/course" use="@courseCode"/>

就在您得到好答案之前,我已经准备好了这个例子。因为这只是一个稍微不同的方法,我想我无论如何都会发布它


<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="html" indent="no" encoding="UTF-8" omit-xml-declaration="yes" />

  <xsl:key name="courses" match="course" use="@courseCode"/>

  <xsl:template match="school">
      <html>
        <body>
          <p>Courses taken by:</p>
          <ul>
            <xsl:apply-templates select="student"/>
          </ul>
        </body>
      </html>
  </xsl:template>

  <xsl:template match="student">
    <li>
      <xsl:value-of select="name"/>
      <ul>
        <xsl:apply-templates select="takes"/>
      </ul>
    </li>
  </xsl:template>

  <xsl:template match="takes">
    <li>
      <xsl:value-of select="."/>
      <xsl:value-of select="key('courses', normalize-space(.))/courseName"/>
    </li>
  </xsl:template>

</xsl:stylesheet> 


参加的课程:


  • 就在您得到好答案之前,我已经准备好了这个例子。因为这只是一个稍微不同的方法,我想我无论如何都会发布它

    
    <?xml version="1.0" encoding="utf-8"?>
    
    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
      <xsl:output method="html" indent="no" encoding="UTF-8" omit-xml-declaration="yes" />
    
      <xsl:key name="courses" match="course" use="@courseCode"/>
    
      <xsl:template match="school">
          <html>
            <body>
              <p>Courses taken by:</p>
              <ul>
                <xsl:apply-templates select="student"/>
              </ul>
            </body>
          </html>
      </xsl:template>
    
      <xsl:template match="student">
        <li>
          <xsl:value-of select="name"/>
          <ul>
            <xsl:apply-templates select="takes"/>
          </ul>
        </li>
      </xsl:template>
    
      <xsl:template match="takes">
        <li>
          <xsl:value-of select="."/>
          <xsl:value-of select="key('courses', normalize-space(.))/courseName"/>
        </li>
      </xsl:template>
    
    </xsl:stylesheet> 
    
    
    
    参加的课程:


  • 在我的回答中,我假设/school是根节点,其他所有内容都直接位于根节点之下……此外,建议您使用标准xml。这个额外的空白会伤害你,日期应该遵循正常的布局;“2-2-1992”的诞生日期应该是“1992-02-02”。在我的回答中,我假设/school是根节点,其他所有内容都直接位于根节点之下……此外,建议您使用标准xml。这个额外的空白会伤害你,日期应该遵循正常的布局;“1992年2月2日”的出生日期应该是“1992年2月2日”。你是对的,在takes节点中的问题空间。我还将text()改为current(),然后它就可以正常工作了。但是,您的代码也非常适用于空格thx。您在takes节点中的问题空格是正确的。我还将text()改为current(),然后它就可以正常工作了。但是你的代码也非常适用于空格thx。这并没有什么不同。。。规范化空间和xsl:key的使用相同-唯一的区别是xsl:variable的使用,这不是一个重要的区别。没错,但我想到的一个细微的区别是xsl:for each与xsl:template的最初使用。这并不是很不同。。。规范化空间和xsl:key的使用是一样的——唯一的区别是xsl:variable的使用,这不是一个重要的区别。没错,但我想到的一个细微的区别是xsl:for each与xsl:template的最初使用。