XSLT для каждого узла - PullRequest
       1

XSLT для каждого узла

0 голосов
/ 09 марта 2012

У меня есть следующая структура 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 | Location | Name| Class | Age)

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 Ответ

1 голос
/ 09 марта 2012

Как насчет изменения 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...