使用XSLT对XML进行排序?
问题描述:
我使用XSLT使用XSLT对XML进行排序?
显示我的XML我的XML看起来像这样
<main>
<DATA_RECORD>
<DESCRIPTION></DESCRIPTION>
<TITLE>Financial Accounting</TITLE>
<COURSE_NUM>1010</COURSE_NUM>
<MIN_CREDITS>4</MIN_CREDITS>
<MAX_CREDITS></MAX_CREDITS>
<SUBJ>ACCT</SUBJ>
<DEPT_ID>BUSN</DEPT_ID>
<DEPT>Business</DEPT>
</DATA_RECORD>
<DATA_RECORD>
<DESCRIPTION></DESCRIPTION>
<TITLE>Managerial Accounting</TITLE>
<COURSE_NUM>1020</COURSE_NUM>
<MIN_CREDITS>4</MIN_CREDITS>
<MAX_CREDITS></MAX_CREDITS>
<SUBJ>ACCT</SUBJ>
<DEPT_ID>BUSN</DEPT_ID>
<DEPT>Business</DEPT>
</DATA_RECORD>
<DATA_RECORD>
<DESCRIPTION></DESCRIPTION>
<TITLE>Computerized Accounting</TITLE>
<COURSE_NUM>1030</COURSE_NUM>
<MIN_CREDITS>3</MIN_CREDITS>
<MAX_CREDITS></MAX_CREDITS>
<SUBJ>ACCT</SUBJ>
<DEPT_ID>BUSN</DEPT_ID>
<DEPT>Business</DEPT>
</DATA_RECORD>
<DATA_RECORD>
<DESCRIPTION></DESCRIPTION>
<TITLE>ELEM ACCT I ADV PLACE</TITLE>
<COURSE_NUM>1110</COURSE_NUM>
<MIN_CREDITS>4</MIN_CREDITS>
<MAX_CREDITS></MAX_CREDITS>
<SUBJ>ACCT</SUBJ>
<DEPT_ID>BUSN</DEPT_ID>
<DEPT>Business</DEPT>
</DATA_RECORD>
<DATA_RECORD>
<DESCRIPTION></DESCRIPTION>
<TITLE>ELEM ACCT II ADV PLACE</TITLE>
<COURSE_NUM>1120</COURSE_NUM>
<MIN_CREDITS>4</MIN_CREDITS>
<MAX_CREDITS></MAX_CREDITS>
<SUBJ>ACCT</SUBJ>
<DEPT_ID>BUSN</DEPT_ID>
<DEPT>Business</DEPT>
</DATA_RECORD>
<DATA_RECORD>
<DESCRIPTION></DESCRIPTION>
<TITLE>Personal Income Taxes</TITLE>
<COURSE_NUM>1500</COURSE_NUM>
<MIN_CREDITS>3</MIN_CREDITS>
<MAX_CREDITS></MAX_CREDITS>
<SUBJ>ACCT</SUBJ>
<DEPT_ID>BUSN</DEPT_ID>
<DEPT>Business</DEPT>
</DATA_RECORD>
<DATA_RECORD>
<DESCRIPTION></DESCRIPTION>
<TITLE>Business Income Taxes</TITLE>
<COURSE_NUM>1510</COURSE_NUM>
<MIN_CREDITS>3</MIN_CREDITS>
<MAX_CREDITS></MAX_CREDITS>
<SUBJ>ACCT</SUBJ>
<DEPT_ID>BUSN</DEPT_ID>
<DEPT>Business</DEPT>
</DATA_RECORD>
<DATA_RECORD>
<DESCRIPTION></DESCRIPTION>
<TITLE>PAYROLL</TITLE>
<COURSE_NUM>1600</COURSE_NUM>
<MIN_CREDITS>2</MIN_CREDITS>
<MAX_CREDITS></MAX_CREDITS>
<SUBJ>ACCT</SUBJ>
<DEPT_ID>BUSN</DEPT_ID>
<DEPT>Business</DEPT>
</DATA_RECORD>
<DATA_RECORD>
<DESCRIPTION></DESCRIPTION>
<TITLE>Intermediate Accounting I</TITLE>
<COURSE_NUM>2010</COURSE_NUM>
<MIN_CREDITS>4</MIN_CREDITS>
<MAX_CREDITS></MAX_CREDITS>
<SUBJ>ACCT</SUBJ>
<DEPT_ID>BUSN</DEPT_ID>
<DEPT>Business</DEPT>
</DATA_RECORD>
<DATA_RECORD>
<DESCRIPTION></DESCRIPTION>
<TITLE>Intermediate Accounting II</TITLE>
<COURSE_NUM>2020</COURSE_NUM>
<MIN_CREDITS>4</MIN_CREDITS>
<MAX_CREDITS></MAX_CREDITS>
<SUBJ>ACCT</SUBJ>
<DEPT_ID>BUSN</DEPT_ID>
<DEPT>Business</DEPT>
</DATA_RECORD>
<DATA_RECORD>
<DESCRIPTION></DESCRIPTION>
<TITLE>MANAGERIAL ACCOUNTING</TITLE>
<COURSE_NUM>2030</COURSE_NUM>
<MIN_CREDITS>4</MIN_CREDITS>
<MAX_CREDITS></MAX_CREDITS>
<SUBJ>ACCT</SUBJ>
<DEPT_ID>BUSN</DEPT_ID>
<DEPT>Business</DEPT>
</DATA_RECORD>
<DATA_RECORD>
<DESCRIPTION></DESCRIPTION>
<TITLE>ADMIN DCTN & TRANSC</TITLE>
<COURSE_NUM>2540</COURSE_NUM>
<MIN_CREDITS>5</MIN_CREDITS>
<MAX_CREDITS></MAX_CREDITS>
<SUBJ>ADAS</SUBJ>
<DEPT_ID>OFAD</DEPT_ID>
<DEPT>Office Administration</DEPT>
</DATA_RECORD>
<DATA_RECORD>
<DESCRIPTION></DESCRIPTION>
<TITLE>MS Office Applications II</TITLE>
<COURSE_NUM>2510</COURSE_NUM>
<MIN_CREDITS>3</MIN_CREDITS>
<MAX_CREDITS></MAX_CREDITS>
<SUBJ>ADAS</SUBJ>
<DEPT_ID>OFTD</DEPT_ID>
<DEPT>Admsntrtv Office Technology</DEPT>
</DATA_RECORD>
<DATA_RECORD>
<DESCRIPTION>This is an introductory course for beginners emphasizing correct pronunciation and basic vocabulary for practical use in everyday conversational situations and travel dialogues. Students with no previous study of the language are prepared to use and understand it within a limited context and basic structure. Lecture: 3 hours</DESCRIPTION>
<TITLE>Office Transcription II</TITLE>
<COURSE_NUM>2520</COURSE_NUM>
<MIN_CREDITS>2</MIN_CREDITS>
<MAX_CREDITS></MAX_CREDITS>
<SUBJ>ADAS</SUBJ>
<DEPT_ID>OFTD</DEPT_ID>
<DEPT>Admsntrtv Office Technology</DEPT>
</DATA_RECORD>
<DATA_RECORD>
<DESCRIPTION></DESCRIPTION>
<TITLE>Office Tech & Procedures II</TITLE>
<COURSE_NUM>2530</COURSE_NUM>
<MIN_CREDITS>3</MIN_CREDITS>
<MAX_CREDITS></MAX_CREDITS>
<SUBJ>ADAS</SUBJ>
<DEPT_ID>OFTD</DEPT_ID>
<DEPT>Admsntrtv Office Technology</DEPT>
</DATA_RECORD>
<DATA_RECORD>
<DESCRIPTION></DESCRIPTION>
<TITLE>Administrative Office Mgt</TITLE>
<COURSE_NUM>2570</COURSE_NUM>
<MIN_CREDITS>3</MIN_CREDITS>
<MAX_CREDITS></MAX_CREDITS>
<SUBJ>ADAS</SUBJ>
<DEPT_ID>OFTD</DEPT_ID>
<DEPT>Admsntrtv Office Technology</DEPT>
</DATA_RECORD>
<DATA_RECORD>
<DESCRIPTION></DESCRIPTION>
<TITLE>Office Admin Coop Ed I</TITLE>
<COURSE_NUM>2580</COURSE_NUM>
<MIN_CREDITS>3</MIN_CREDITS>
<MAX_CREDITS></MAX_CREDITS>
<SUBJ>ADAS</SUBJ>
<DEPT_ID>OFTD</DEPT_ID>
<DEPT>Admsntrtv Office Technology</DEPT>
</DATA_RECORD>
<DATA_RECORD>
<DESCRIPTION></DESCRIPTION>
<TITLE>Office Admin Coop Ed II</TITLE>
<COURSE_NUM>2590</COURSE_NUM>
<MIN_CREDITS>4</MIN_CREDITS>
<MAX_CREDITS></MAX_CREDITS>
<SUBJ>ADAS</SUBJ>
<DEPT_ID>OFTD</DEPT_ID>
<DEPT>Admsntrtv Office Technology</DEPT>
</DATA_RECORD>
<DATA_RECORD>
<DESCRIPTION></DESCRIPTION>
<TITLE>MS Office Applications III</TITLE>
<COURSE_NUM>2610</COURSE_NUM>
<MIN_CREDITS>3</MIN_CREDITS>
<MAX_CREDITS></MAX_CREDITS>
<SUBJ>ADAS</SUBJ>
<DEPT_ID>OFTD</DEPT_ID>
<DEPT>Admsntrtv Office Technology</DEPT>
</DATA_RECORD>
<DATA_RECORD>
<DESCRIPTION></DESCRIPTION>
<TITLE>Office Admin Career Dev</TITLE>
<COURSE_NUM>2620</COURSE_NUM>
<MIN_CREDITS>3</MIN_CREDITS>
<MAX_CREDITS></MAX_CREDITS>
<SUBJ>ADAS</SUBJ>
<DEPT_ID>OFTD</DEPT_ID>
<DEPT>Admsntrtv Office Technology</DEPT>
</DATA_RECORD>
<DATA_RECORD>
<DESCRIPTION></DESCRIPTION>
<TITLE>NURSING I</TITLE>
<COURSE_NUM>1010</COURSE_NUM>
<MIN_CREDITS>7</MIN_CREDITS>
<MAX_CREDITS></MAX_CREDITS>
<SUBJ>ADNU</SUBJ>
<DEPT_ID>ADN</DEPT_ID>
<DEPT>AD Nursing</DEPT>
</DATA_RECORD>
<DATA_RECORD>
<DESCRIPTION></DESCRIPTION>
<TITLE>NURSING II</TITLE>
<COURSE_NUM>1020</COURSE_NUM>
<MIN_CREDITS>7</MIN_CREDITS>
<MAX_CREDITS></MAX_CREDITS>
<SUBJ>ADNU</SUBJ>
<DEPT_ID>ADN</DEPT_ID>
<DEPT>AD Nursing</DEPT>
</DATA_RECORD>
</main>
我的XSLT看起来像这样
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<?xml-stylesheet href="/_resources-2016/xsl/catalog.xsl" type="text/xsl"?>
<xsl:output method="html"/>
<xsl:template match ="/">
<html>
<head>
<script language="javascript" type="text/javascript"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-xs-12">
<xsl:for-each select="main/DATA_RECORD">
<!--<h2><xsl:value-of select="SUBJ" /> (<xsl:value-of select="DEPT" />)</h2> -->
<ul class="verysimplelist">
<li style="font-size:150%; font-weight:400">
<xsl:value-of select="SUBJ" />
</li>
<li style="font-size:150%; font-weight:400">
<xsl:value-of select="COURSE_NUM"/>
- </li>
<li style="font-size:140%; font-weight:400; font-style:italic">
<xsl:value-of select="TITLE"/>
</li>
<li style="font-size:150%; font-weight:400">
(<xsl:value-of select="MIN_CREDITS"/>
Credits)</li>
</ul>
<p>
<xsl:value-of select="DESCRIPTION" />
</p>
</xsl:for-each>
</div>
</div>
</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
所以使用 - 每个作品对我和我得到所需的输出,但我想一些额外的功能。
我希望他们仍然按字母顺序分组,但是通过<DEPT>
,在每个组的顶部都有一个h2标签或类似的名称。我似乎无法得到这个工作。有任何想法吗?谢谢!
答
如前所述,在XSLT 1.0中,考虑Muenchian分组,其中通过某个键<xsl:key>
索引文档,然后生成分组并映射相同分组下的相应节点。
下面为每个Dept添加一个<h2>
标记作为其他<DATA_RECORD>
节点输出之上的标头。
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<?xml-stylesheet href="/_resources-2016/xsl/catalog.xsl" type="text/xsl"?>
<xsl:output method="html"/>
<xsl:key name="deptid" match="DATA_RECORD" use="DEPT"/>
<xsl:template match ="/main">
<xsl:apply-templates select="DATA_RECORD"/>
</xsl:template>
<xsl:template match ="DATA_RECORD">
<html>
<head>
<script language="javascript" type="text/javascript"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-xs-12">
<xsl:for-each select="self::node()[generate-id() =
generate-id(key('deptid', DEPT)[1])]">
<h2><xsl:value-of select="DEPT"/></h2>
<xsl:for-each select="key('deptid', DEPT)">
<!--<h2><xsl:value-of select="SUBJ" /> (<xsl:value-of select="DEPT" />)</h2> -->
<ul class="verysimplelist">
<li style="font-size:150%; font-weight:400"><xsl:value-of select="SUBJ" /></li>
<li style="font-size:150%; font-weight:400"><xsl:value-of select="COURSE_NUM"/> - </li>
<li style="font-size:140%; font-weight:400; font-style:italic"><xsl:value-of select="TITLE"/></li>
<li style="font-size:150%; font-weight:400">(<xsl:value-of select="MIN_CREDITS"/> Credits)</li>
</ul>
<p>
<xsl:value-of select="DESCRIPTION" />
</p>
</xsl:for-each>
</xsl:for-each>
</div>
</div>
</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
您正在寻找[Muenchian分组](https://stackoverflow.com/questions/tagged/muenchian-grouping)。 – zx485
使用[exslt:node-set](http://exslt.org/exsl/functions/node-set/index.html)使生活变得更加简单。 – o11c
我同意zx485,这听起来像一个分组问题。你可以在你的输入中添加更多的'DATA_RECORD',并添加所需的输出示例吗?这将帮助我们看到你想要分组和排序的内容。应该很容易让你成为[muenchian分组]的例子(http://www.jenitennison.com/xslt/grouping/muenchian.html)。 –