【发布时间】:2014-09-18 15:15:12
【问题描述】:
我有 XML 数据,想按 INSPTR 和 ELVINSP_DT 对其进行分组。文章末尾的问题。
这是我的 XML:
<AS400_ELVPINS00Collection>
<ObjList>
<AS400_ELVPINS00>
<ID>123456</ID>
<ELVINSP_DT>2014-05-01</ELVINSP_DT>
<DetailData>Out Sick</DetailData>
<INSPTR>
<ID>555123</ID>
<INSPTR_NAME>Doe, John P</INSPTR_NAME>
<MoreDetailData>Northeast Region</MoreDetailData>
</INSPTR>
</AS400_ELVPINS00>
<AS400_ELVPINS00>
<ID>123459</ID>
<ELVINSP_DT>2014-05-02</ELVINSP_DT>
<DetailData>Nobody showed up</DetailData>
<INSPTR>
<ID>555123</ID>
<INSPTR_NAME>Doe, John P</INSPTR_NAME>
<MoreDetailData>Northeast Region</MoreDetailData>
</INSPTR>
</AS400_ELVPINS00>
<AS400_ELVPINS00>
<ID>123463</ID>
<ELVINSP_DT>2014-05-01</ELVINSP_DT>
<DetailData>Job Location was clear</DetailData>
<INSPTR>
<ID>555124</ID>
<INSPTR_NAME>Smith, John T</INSPTR_NAME>
<MoreDetailData>South Central Region</MoreDetailData>
</INSPTR>
</AS400_ELVPINS00>
</ObjList>
</AS400_ELVPINS00Collection>
我想要这样列出的数据:
Doe, John P
2014-05-01 - Out Sick
2014-05-02 - Nobody showed up
Smith, John T
2014-05-01 - Job Location was clear
这是我正在为 XSLT 尝试的内容:
<xsl:key name="keyInsptr" match="ObjList/AS400_ELVPINS00" use="INSPTR" />
<xsl:key name="keyDate" match="ObjList/AS400_ELVPINS00" use="ELVINSP_DT" />
<fo:flow flow-name="xsl-region-body">
<xsl:for-each select="ObjList/AS400_ELVPINS00[generate-id(.)=generate-id(key('keyInsptr',INSPTR)[1])]">
<xsl:sort select="INSPTR/INSPTR_NAME"/>
<!-- This part works -->
<fo:block>
<xsl:value-of select="INSPTR/INSPTR_NAME" />
</fo:block>
<!-- This part DOES NOT work -->
<xsl:variable name="vrInsptID">
<xsl:value-of select="INSPTR/INSPTR_NAME"/>
</xsl:variable>
<xsl:variable name="lstInsp" select="ObjList/AS400_ELVPINS00[INSPTR/INSPTR_NAME=vrInsptrID]" />
<xsl:for-each select="lstInsp[generate-id(.)=generate-id(key('keyDate',ELVINSP_DT)[1])]">
<fo:block>
<xsl:text> - </xsl:text>
<xsl:call-template name="dateFormat">
<xsl:with-param name="value" select="lstInsp/ELVINSP_DT" />
</xsl:call-template>
</fo:block>
</xsl:for-each>
</xsl:for-each>
</fo:flow>
我知道 generate-id 会在运行时为元素创建一个唯一的“id”,所以我假设 generate-id(.) 将为每个 ObjList/AS400_ELVPINS00 元素生成一个 id 以在匹配中使用,对吗?
generate-id(key('keyInsptr',INSPTR)[1]) 是做什么的?这会产生什么样的结果?我试图形象化这一点。
当我在 keyInsptr 上执行“for-each”时,我在该 for-each 中使用什么节点集?
如何让内部的“for-each”正确循环日期?
我不只是想让它发挥作用,还要了解它应该如何工作。谢谢。
【问题讨论】:
-
网上充斥着对孟池分组的解释,建议大家学习the one by Jeni Tennison。
-
谢谢,我昨天已经读过了。只是没有完全理解。看看你下面的答案。谢谢。
-
其实下面的答案是Martin Honnen写的,不是我写的。只是说。