XSL查找最后一个节点



我的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作为全局外部参数传递给转换,这使其具有高可重用性。

相关内容

  • 没有找到相关文章

最新更新