XSLT for-each节点

时间:2012-03-09 08:59:19

标签: xml xslt

我在命名空间中有以下XML结构:

<School>
  <SchoolInfo>
    <SchoolName>The Big School</SchoolName>
    <Opened>2008</Opened>
    <SchoolID>SCH1122</SchoolID>
    <Geograpics>
      <Location>London</Location>
      <PostCode>ZZ11 1ZZ</PostCode>
    </Geographics>
  </SchoolInfo>
  <Pupil>
    <Name>Tom</Name>
    <LastName>Jones</LastName>
    <Class>12B</Class>
    <Age>16</Age>
  </Pupil>
  <Pupil>
    <Name>Steve</Name>
    <LastName>Jobs</LastName>
    <Class>09A</Class>
    <Age>17</Age>
  </Pupil>
  <Pupil>
    <Name>Joe</Name>
    <LastName>Blogs</LastName>
    <Class>13A</Class>
    <Age>15</Age>
  </Pupil>
</School>

使用XSLTl我希望创建一个看起来像以下结构的PSV: (SchoolID |地点|名称|类|年龄)

SCH1122|London|Tom|12B|16
SCH1122|London|Steve|09A|17
SCH1122|London|Joe|13A|15

这是否可以使用XSLT,我将如何解决这个问题?

到目前为止

代码:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="NamespaceHere"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:cs="urn:cs"
exclude-result-prefixes="cs x msxsl" >

<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
<xsl:strip-space elements="*"/>

<xsl:template match="x:SchoolID">
    <xsl:value-of select="text()"/>
    <xsl:text>|</xsl:text>
</xsl:template>

<xsl:template match="x:PostCode">
    <xsl:value-of select="text()"/>
    <xsl:text>|</xsl:text>
</xsl:template>

<xsl:template match="x:Name">
    <xsl:value-of select="text()"/>
    <xsl:text>|</xsl:text>
</xsl:template>

<xsl:template match="x:Class">
    <xsl:value-of select="text()"/>
    <xsl:text>|</xsl:text>
</xsl:template>

<xsl:template match="x:Age">
    <xsl:value-of select="text()"/>
    <xsl:text>|</xsl:text>
</xsl:template>

<xsl:template match="text()">
    <xsl:apply-templates select="x:Message"/>
</xsl:template>

<xsl:template match="x:School">
    <xsl:apply-templates select="x:SchoolInfo/x:SchoolID"/>
    <xsl:apply-templates select="x:SchoolInfo/x:Geographics/x:PostCode"/>
    <xsl:apply-templates select="x:Pupil/x:Name"/>
    <xsl:apply-templates select="x:Pupil/x:Class"/>
    <xsl:apply-templates select="x:Pupil/x:Age"/>
    <xsl:text>&#0010;</xsl:text>
</xsl:template>
</xsl:stylesheet>

当我只有一个瞳孔时,这是有效的,但是当我得到多个瞳孔时,输出变得如下:

  

SCH1122 | |伦敦|汤姆|史蒂夫| 12B | 09A | 16 | 17

1 个答案:

答案 0 :(得分:1)

如何将match="x:School"更改为:

<xsl:template match="x:School">
  <xsl:variable name="parent" select="."/>
  <xsl:for-each select="x:Pupil">
    <xsl:apply-templates select="$parent/x:SchoolInfo/x:SchoolID"/>
    <xsl:apply-templates select="$parent/x:SchoolInfo/x:Geographics/x:PostCode"/>
    <xsl:apply-templates select="x:Name"/>
    <xsl:apply-templates select="x:Class"/>
    <xsl:apply-templates select="x:Age"/>
    <xsl:text>&#0010;</xsl:text>
  </xsl:for-each>
</xsl:template>