2012-03-09 78 views
0

我有以下XML结构驻留在命名空间内:XSLT的,每个节点

<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

+0

到目前为止,我已经得到它以正确的顺序输出PSV,但是当处理每个瞳孔时,我完全难以理解,所以关于如何在每个瞳孔上循环的指导,同时仍然可以访问节点在学生之外,将不胜感激 – Mike 2012-03-09 09:19:07

+0

您可以发布您的代码到目前为止? – 2012-03-09 09:21:07

+0

现在添加的代码:) - 我正在修改代码,因为我正在使用的实际文档的灵敏度,但该代码应该工作:) – Mike 2012-03-09 09:32:41

回答

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> 
+0

工作完美,没想到它变得如此简单!非常感谢。 – Mike 2012-03-09 10:40:00