我有一个XML文件,列出了学位课程下的课程。我创建了一个XSLT(带帮助),可以在学位名称下成功创建一组类。但是客户想要第三级来识别选修课和非选修课。如果是选修课,则选择性字段列为数据“Y”,如果不是,则列为“N”,否则为“程序要求”。
如果元素<FlagElectives1>
中有“N”,我需要在XSLT中添加另一个级别,该级别将标题为“Program Requirement”的类分组。
我想我需要根据这个元素创建另一个键,对,然后创建一个模板,创建一个xsl:text标题,表示:“Program Requirement”或“Program Elective”但我被卡住了。我以前从未做过三级分组。
这是我的XSLT:
<?xml version="1.0"?>
<!-- DWXMLSource="STX049 Catalog parsed.xml" -->
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="no"/>
<xsl:template match="/">
<CrystalReport>
<xsl:apply-templates/>
</CrystalReport>
</xsl:template>
<xsl:key name="degrees-by-title" match="CrystalReport/Group/Group/Group/Details" use="Section/ICCB1" />
<xsl:template match="CrystalReport/Group/Group/Group">
<Degree>
<xsl:for-each select="Details[count(. | key('degrees-by-title', Section/ICCB1)[1]) = 1]">
<xsl:sort select="Section/ACADPROGRAMSID1" />
<department>
<Degreetitle>
<xsl:apply-templates select="Section/ACPGDEGREE1" />
</Degreetitle>
<Certtitle>
<xsl:apply-templates select="Section/CCD11" />
</Certtitle>
<DegreeDesc>
<xsl:value-of select="Section/ACPGCOMMENTS1"/>
</DegreeDesc>
<ICCBcode>
<xsl:value-of select="Section/ICCB1"/>
</ICCBcode>
<ProgramID>
<xsl:value-of select="Section/ACADPROGRAMSID1"/>
</ProgramID>
<xsl:for-each select="key('degrees-by-title', Section/ICCB1)">
<xsl:sort select="Section/FlagElectives1" order="ascending" />
<xsl:sort select="Section/DEPARTMENT11" />
<xsl:sort select="Section/CRSNO1" />
<Details>
<class>
<deptname>
<xsl:value-of select="Section/DEPARTMENT11"/>
</deptname>
<courseno>
<xsl:value-of select="Section/CRSNO1"/>
</courseno>
<classname>
<xsl:value-of select="Section/CRSTITLE1"/>
</classname>
<classcredit>
<xsl:value-of select="Section/CRSMINCRED1"/>
</classcredit>
<Elective>
<xsl:value-of select="Section/FlagElectives1" />
</Elective>
</class>
</Details>
</xsl:for-each>
</department>
</xsl:for-each>
</Degree>
</xsl:template>
<xsl:template match="Section/ACPGDEGREE1[child::node()]">
<xsl:value-of select="."/>
<xsl:text> DEGREE</xsl:text>
</xsl:template>
<xsl:template match="Section/CCD11[child::node()]">
<xsl:text> CERTIFICATE</xsl:text>
</xsl:template>
</xsl:stylesheet>
以下是我的XML结构:
<?xml version="1.0" encoding="UTF-8"?>
<CrystalReport>
<Group Level="1">
<Group Level="2">
<Group Level="3">
<Details>
<Section>
<ACPGDEGREE1>AAS</ACPGDEGREE1>
<CCD11/>
<ACPGCOMMENTS1>The Accounting program</ACPGCOMMENTS1>
<ICCB1>3203</ICCB1>
<ACADPROGRAMSID1>ACCOU.AAS</ACADPROGRAMSID1>
<CRSNO1>1110</CRSNO1>
<ACRBPRINTEDSPEC1/>
<ACPGHOMELANGNOTREQDRSN1>General Education</ACPGHOMELANGNOTREQDRSN1>
<CRSMINCRED1>2</CRSMINCRED1>
<ACPGAREAOFSTUDY1>Accounting</ACPGAREAOFSTUDY1>
<CRSTITLE1>Using Computers: An Introduction</CRSTITLE1>
<DEPARTMENT11>ACCOU</DEPARTMENT11>
<CRSSUBJECT1>CIS</CRSSUBJECT1>
<ACRBLABEL1>CIS REQUIREMENT</ACRBLABEL1>
<CRSMAXCRED1/>
<FlagElectives1>N</FlagElectives1>
</Section>
</Details>
<Details>
<Section>
<ACPGDEGREE1>AAS</ACPGDEGREE1>
<CCD11/>
<ACPGCOMMENTS1>The Accounting program</ACPGCOMMENTS1>
<ICCB1>3203</ICCB1>
<ACADPROGRAMSID1>ACCOU.AAS</ACADPROGRAMSID1>
<CRSNO1>1150</CRSNO1>
<ACRBPRINTEDSPEC1/>
<ACPGHOMELANGNOTREQDRSN1>General Education</ACPGHOMELANGNOTREQDRSN1>
<CRSMINCRED1>3</CRSMINCRED1>
<ACPGAREAOFSTUDY1>Accounting</ACPGAREAOFSTUDY1>
<CRSTITLE1>Intro to Computer</CRSTITLE1>
<DEPARTMENT11>ACCOU</DEPARTMENT11>
<CRSSUBJECT1>CIS</CRSSUBJECT1>
<ACRBLABEL1>CIS</ACRBLABEL1>
<CRSMAXCRED1/>
<FlagElectives1>Y</FlagElectives1>
</Section>
</Details>
</Group>
</Group>
</Group>
</CrystalReport>
第一级分组应基于元素<DEPARTMENT11>
。各种学位和证书的标题可在字段<ACPGAREAOFSTUDY1>
中找到
所有这些中的第二级唯一字段是<ACADPROGRAMSID1>
这是所需的输出:
<CrystalReport>
<Degrees>
<!--group and repeat "Degrees" for-each based on element ACPGAREAOFSTUDY1-->
<areaofstudy>Accounting</areaofstudy>
<Degree>
<department>
<!--group and repeat "department" for-each based on element ICCB1-->
<Degreetitle>AAS DEGREE</Degreetitle>
<Certtitle />
<DegreeDesc>The Accounting program</DegreeDesc>
<ICCBcode>3203</ICCBcode>
<ProgramID>ACCOU.AAS</ProgramID>
<!--group and repeat "Details" for-each based on element ACADPROGRAMSID1 under titles "Program Requirement" or "Program Elective" based on element "FlagElectives1"-->
<h1>Program Requirements</h1>
<Details>
<class>
<deptname>ACCOU</deptname>
<courseno>1150</courseno>
<classname>Intro to Computer</classname>
<classcredit>3</classcredit>
<Elective>N</Elective>
</class>
</Details>
<h1>Program Electives</h1>
<Details>
<class>
<deptname>ACCOU</deptname>
<courseno>1110</courseno>
<classname>Using Computers: An Introduction</classname>
<classcredit>2</classcredit>
<Elective>Y</Elective>
</class>
</Details>
</department>
</Degree>
<Degree>
<department>
<Degreetitle>AAS DEGREE</Degreetitle>
<Certtitle />
<DegreeDesc>The Accounting program</DegreeDesc>
<ICCBcode>3203</ICCBcode>
<ProgramID>ACCOU.AAS</ProgramID>
<h1>Program Requirements</h1>
<Details>
<class>
<deptname>ACCOU</deptname>
<courseno>1150</courseno>
<classname>Intro to Computer</classname>
<classcredit>3</classcredit>
<Elective>Y</Elective>
</class>
</Details>
<h1>Program Electives</h1>
<Details>
<class>
<deptname>ACCOU</deptname>
<courseno>1110</courseno>
<classname>Using Computers: An Introduction</classname>
<classcredit>2</classcredit>
<Elective>N</Elective>
</class>
</Details>
</department>
</Degree>
</Degrees>
</CrystalReport>
答案 0 :(得分:0)
我在你的XSLT上做了一些清理工作。每当for-each
嵌套在for-each
内时,这是一个很好的信号,表明您的XSLT需要进行一些重构。我想通过将课程分组是否是选修课来理解你的意思(虽然你没有表明你想如何表示),所以我想出的是:
<?xml version="1.0"?>
<!-- DWXMLSource="STX049 Catalog parsed.xml" -->
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="no"/>
<xsl:variable name="allSections"
select="/CrystalReport/Group/Group/Group/Details/Section" />
<xsl:key name="kArea" match="Section" use="ACPGAREAOFSTUDY1"/>
<xsl:key name="kDegree" match="Section"
use="concat(ACPGAREAOFSTUDY1, '+', ACPGDEGREE1)" />
<xsl:key name="kDepartment" match="Section"
use="concat(ACPGAREAOFSTUDY1, '+', ACPGDEGREE1, '+', ICCB1)" />
<xsl:variable name="degreeFirsts"
select="$allSections[generate-id() =
generate-id(key('kDegree',
concat(ACPGAREAOFSTUDY1, '+', ACPGDEGREE1))[1])]" />
<xsl:variable name="deptFirsts"
select="$allSections[generate-id() =
generate-id(key('kDepartment',
concat(ACPGAREAOFSTUDY1, '+', ACPGDEGREE1, '+', ICCB1))[1])]" />
<xsl:template match="/">
<CrystalReport>
<Degrees>
<xsl:apply-templates
select="$allSections[generate-id() =
generate-id(key('kArea', ACPGAREAOFSTUDY1)[1])]"
mode="group"/>
</Degrees>
</CrystalReport>
</xsl:template>
<xsl:template match="Section" mode="group">
<xsl:variable name="area" select="ACPGAREAOFSTUDY1" />
<areaofstudy>
<xsl:value-of select="$area"/>
</areaofstudy>
<xsl:apply-templates select="$degreeFirsts[ACPGAREAOFSTUDY1 = $area]"
mode="degree"/>
</xsl:template>
<xsl:template match="Section" mode="degree">
<xsl:variable name="area" select="ACPGAREAOFSTUDY1" />
<xsl:variable name="degree" select="ACPGDEGREE1" />
<xsl:text>
</xsl:text>
<Degree>
<xsl:apply-templates
select="$deptFirsts[ACPGAREAOFSTUDY1 = $area and ACPGDEGREE1 = $degree]"
mode="department">
<xsl:sort select="ACADPROGRAMSID1" />
</xsl:apply-templates>
</Degree>
</xsl:template>
<xsl:template match="Section" mode="department">
<department>
<Degreetitle>
<xsl:apply-templates select="ACPGDEGREE1" />
</Degreetitle>
<Certtitle>
<xsl:apply-templates select="CCD11" />
</Certtitle>
<xsl:text>
</xsl:text>
<DegreeDesc>
<xsl:apply-templates select="ACPGCOMMENTS1" />
</DegreeDesc>
<xsl:text>
ICCB Code</xsl:text>
<ICCBcode>
<xsl:apply-templates select="ICCB1" />
</ICCBcode>
<xsl:text> | Field of Study Code: </xsl:text>
<ProgramID>
<xsl:apply-templates select="ACADPROGRAMSID1" />
</ProgramID>
<xsl:variable name="courses"
select="key('kDepartment',
concat(ACPGAREAOFSTUDY1, '+', ACPGDEGREE1, '+', ICCB1))" />
<xsl:call-template name="CourseGroup">
<xsl:with-param name="courses" select="$courses[FlagElectives1 = 'N']" />
<xsl:with-param name="title" select="'Program Requirements'" />
</xsl:call-template>
<xsl:call-template name="CourseGroup">
<xsl:with-param name="courses" select="$courses[FlagElectives1 = 'Y']" />
<xsl:with-param name="title" select="'Program Electives'" />
</xsl:call-template>
</department>
</xsl:template>
<xsl:template name="CourseGroup">
<xsl:param name="courses" />
<xsl:param name="title" />
<xsl:if test="$courses">
<xsl:text>
</xsl:text>
<xsl:value-of select="$title" />
<xsl:apply-templates select="$courses">
<xsl:sort select="FlagElectives1" order="ascending" />
<xsl:sort select="DEPARTMENT11" />
<xsl:sort select="CRSNO1" />
</xsl:apply-templates>
</xsl:if>
</xsl:template>
<xsl:template match="Section">
<xsl:text>
</xsl:text>
<Details>
<class>
<deptname>
<xsl:apply-templates select="DEPARTMENT11" />
</deptname>
<xsl:text> </xsl:text>
<courseno>
<xsl:apply-templates select="CRSNO1" />
</courseno>
<xsl:text> </xsl:text>
<classname>
<xsl:apply-templates select="CRSTITLE1" />
</classname>
<xsl:text> </xsl:text>
<classcredit>
<xsl:apply-templates select="CRSMINCRED1" />
</classcredit>
</class>
</Details>
</xsl:template>
<xsl:template match="ACPGDEGREE1/text()">
<xsl:value-of select="concat(., ' DEGREE')"/>
</xsl:template>
<xsl:template match="CCD11/text()">
<xsl:value-of select="concat(., ' CERTIFICATE')" />
</xsl:template>
</xsl:stylesheet>
选修分组是通过call-template
项目实现的,这些项目选择课程是否为选修课程:
<xsl:variable name="courses"
select="key('degrees-by-title', ICCB1)" />
<xsl:call-template name="CourseGroup">
<xsl:with-param name="courses" select="$courses[FlagElectives1 = 'Y']" />
<xsl:with-param name="title" select="'Program Requirements'" />
</xsl:call-template>
在样本输入上运行时,此XSLT会生成:
<CrystalReport>
<Degree>
<department>
<Degreetitle>AAS DEGREE</Degreetitle>
<Certtitle />
<DegreeDesc>The Accounting program</DegreeDesc>
<ICCBcode>3203</ICCBcode>
<ProgramID>ACCOU.AAS</ProgramID>
<h1>Program Requirements</h1>
<Details>
<class>
<deptname>ACCOU</deptname>
<courseno>1150</courseno>
<classname>Intro to Computer</classname>
<classcredit>3</classcredit>
<Elective>Y</Elective>
</class>
</Details>
<h1>Program Electives</h1>
<Details>
<class>
<deptname>ACCOU</deptname>
<courseno>1110</courseno>
<classname>Using Computers: An Introduction</classname>
<classcredit>2</classcredit>
<Elective>N</Elective>
</class>
</Details>
</department>
</Degree>
</CrystalReport>
注意注意要求开始的h1
元素和选修组。如果您希望以其他方式表示,请澄清。