我的XMl是这样的。。如何找到当前的最后一个节点父ID.
<I ID="958" ParentID="1" TOTAL="12"/>
<I ID="959" ParentID="958" TOTAL="0"/>
<I ID="960" ParentID="958" TOTAL="0"/>
<I ID="961" ParentID="958" TOTAL="0"/>
<I ID="962" ParentID="958" TOTAL="0"/>
<I ID="963" ParentID="958" TOTAL="0" />
<I ID="964" ParentID="958" TOTAL="0"/>
<I ID="965" ParentID="958" TOTAL="0"/>
<I ID="964" ParentID="958" TOTAL="0"/>
<I ID="967" ParentID="958" TOTAL="0"/>
<I ID="968" ParentID="958" TOTAL="0"/>
<I ID="969" ParentID="958" TOTAL="0" />
<I ID="970" ParentID="958" TOTAL="0" />
<I ID="971" ParentID="2" TOTAL="12"/>
<I ID="972" ParentID="971" TOTAL="0"/>
<I ID="973" ParentID="971" TOTAL="0"/>
<I ID="974" ParentID="971" TOTAL="0"/>
<I ID="975" ParentID="971" TOTAL="0"/>
<I ID="976" ParentID="971" TOTAL="0" />
<I ID="977" ParentID="971" TOTAL="0"/>
<I ID="978" ParentID="971" TOTAL="0"/>
<I ID="979" ParentID="971" TOTAL="0"/>
<I ID="980" ParentID="971" TOTAL="0"/>
<I ID="981" ParentID="971" TOTAL="0"/>
<I ID="982" ParentID="971" TOTAL="0" />
<I ID="983" ParentID="971" TOTAL="0" />
我想找到
<I ID="970" ParentID="958" TOTAL="0" />
<I ID="983" ParentID="971" TOTAL="0" />
想要改变这个的设计。。。XSLT 1.0
如果您刚好在给定ParentID
的最后一个I
元素之后,则以下操作将完成
<xsl:copy-of select="I[@ParentID=$currentParentID][last()]"/>
如果你在每个ParentID
的最后一个I
元素之后,那么这应该是
<xsl:for-each select="I">
<xsl:if test="empty(following-sibling::I[@ParentID=current()/@ParentID])">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
有一个很好的XLST快速参考http://www.mulberrytech.com/quickref/XSLT_1quickref-v2.pdf
您需要执行以下操作:
- 获取具有第一个父项的父ID的所有项的节点集
- 获取该节点集中所有项目的计数
- 在该节点集上运行if-then,返回主题节点if position((等于count减1
这里要小心。XML本质上是无序的。如果没有键,第二个元素和第十三个元素之间没有区别,只是它们这次碰巧按这个顺序出现。"Happened to"不能保证下次会发生。您的来源应该提供订购密钥或其他原因,说明第13行与之前的11行不同。
如果您提供了现有的XSLT,我可以为您提供一些关于修改它以包含它的建议。
这个简单的转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pId" select="958"/>
<xsl:template match="/">
<xsl:copy-of select="/*/I[@ParentID= $pId][last()]"/>
</xsl:template>
</xsl:stylesheet>
应用于所提供的XML文档时:
<t>
<I ID="958" ParentID="1" TOTAL="12"/>
<I ID="959" ParentID="958" TOTAL="0"/>
<I ID="960" ParentID="958" TOTAL="0"/>
<I ID="961" ParentID="958" TOTAL="0"/>
<I ID="962" ParentID="958" TOTAL="0"/>
<I ID="963" ParentID="958" TOTAL="0" />
<I ID="964" ParentID="958" TOTAL="0"/>
<I ID="965" ParentID="958" TOTAL="0"/>
<I ID="964" ParentID="958" TOTAL="0"/>
<I ID="967" ParentID="958" TOTAL="0"/>
<I ID="968" ParentID="958" TOTAL="0"/>
<I ID="969" ParentID="958" TOTAL="0" />
<I ID="970" ParentID="958" TOTAL="0" />
<I ID="971" ParentID="2" TOTAL="12"/>
<I ID="972" ParentID="971" TOTAL="0"/>
<I ID="973" ParentID="971" TOTAL="0"/>
<I ID="974" ParentID="971" TOTAL="0"/>
<I ID="975" ParentID="971" TOTAL="0"/>
<I ID="976" ParentID="971" TOTAL="0" />
<I ID="977" ParentID="971" TOTAL="0"/>
<I ID="978" ParentID="971" TOTAL="0"/>
<I ID="979" ParentID="971" TOTAL="0"/>
<I ID="980" ParentID="971" TOTAL="0"/>
<I ID="981" ParentID="971" TOTAL="0"/>
<I ID="982" ParentID="971" TOTAL="0" />
<I ID="983" ParentID="971" TOTAL="0" />
</t>
生成所需的正确结果:
<I ID="970" ParentID="958" TOTAL="0"/>
请注意:适当的parentId作为全局外部参数传递给转换,这使其具有高可重用性。