【发布时间】:2014-03-10 19:19:37
【问题描述】:
我有一个来自数据库的平面 XML 文件。我需要使用 XSL 转换将数据分组到更分层的布局中。我已经进行了很多研究,并提出了 Meunchian 分组作为要走的路,但无法让它发挥作用。
我要去:
<Report>
<Data>
<Row>
<Field name ="AssessmentID">1</Field>
<Field name ="Company">Test Company</Field>
<Field name ="Manager">Bob Smith</Field>
<Field name ="IssueID">1-1</Field>
<Field name ="IssueTitle">Security Problem</Field>
<Field name ="IssueDescription">Some Description</Field>
</Row>
<Row>
<Field name ="AssessmentID">1</Field>
<Field name ="Company">Test Company</Field>
<Field name ="Manager">Bob Smith</Field>
<Field name ="IssueID">1-2</Field>
<Field name ="IssueTitle">Other Problem</Field>
<Field name ="IssueDescription">Some Other Description</Field>
</Row>
</Data>
</Report>
到这里:
<Assessments>
<Assessment>
<AssessmentID>1</AssessmentID>
<Company>Test Company</Company>
<Manager>Bob Smith</Manager>
<Issue>
<IssueID>1-1</IssueID>
<IssueTitle>Security Problem</IssueTitle>
<IssueDescription>Some Description</IssueDescription>
</Issue>
<Issue>
<IssueID>1-2</IssueID>
<IssueTitle>Other Problem</IssueTitle>
<IssueDescription>Some Other Description</IssueDescription>
</Issue>
</Assessment>
</Assessments>
这是我目前想出的代码:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="keyAssessmentID" match="Row" use="Field[@name='AssessmentID']"/>
<xsl:key name="keyIssueID" match="Row" use="Field[@name='IssueID']"/>
<xsl:template match="/">
<Assessments>
<!-- Process each Assessment -->
<xsl:for-each select="//Row[generate-id(.) = generate-id(key('keyAssessmentID', Field[@name='AssessmentID'])[1])]">
<!-- Select all the issues belonging to the assessment -->
<xsl:variable name ="lngAssessmentID"><xsl:value-of select="Field[@name='AssessmentID']" /></xsl:variable>
<xsl:variable name="lstIssue" select="//Row[Field[@name='IssueID']=$lngAssessmentID]" />
<!-- show details for Issues in Assessments -->
<xsl:call-template name="ShowIssuesInAssessment">
<xsl:with-param name="lstIssue" select="$lstIssue" />
</xsl:call-template>
</xsl:for-each>
</Assessments>
</xsl:template>
<xsl:template name="ShowIssuesInAssessment">
<xsl:param name="lstIssue" />
<!-- Show the name of the Assessment currently being processed -->
<AssessmentID>
<xsl:value-of select="$lstIssue[1]/Field[@name='AssessmentID']" />
</AssessmentID>
<!-- Show IssueID for each Issue in the Assessment -->
<xsl:for-each select="$lstIssue[generate-id(.) = generate-id(key('keyIssueID', Field[@Name='IssueID'])[1])]">
<xsl:variable name="lngIssueID" select="Field[@Name='IssueID']" />
<!-- Show details of each Issue -->
<Issue>
<IssueID>
<xsl:value-of select="$lstIssue[Field[@Name='IssueID']=$lngIssueID]/Field[@Name='IssueID']" />
</IssueID>
<IssueTitle>
<xsl:value-of select="$lstIssue[Field[@Name='IssueID']=$lngIssueID]/Field[@Name='IssueTitle']" />
</IssueTitle>
</Issue>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我正在编写 CodeProject 上的这个示例:here
感谢大家的帮助!
【问题讨论】:
-
您无法开始工作的 XSLT 代码在哪里
-
OJay,这是我的第一篇 StackOverflow 帖子,感谢您对礼仪的指导。我发布了 XSL 和我一直在使用的示例。
-
您需要对 IssueID 和 AssessmentID 进行分组吗?也就是说,对于给定的 AssessmentID,您能否在文件中多次出现相同的 IssueID?
-
问题 ID 对于每个问题都是唯一的,不会在给定的评估中重复。
标签: xml xslt xml-parsing