我要获取的父级的最后一个子元素没有一个与父元素的属性之一相匹配的属性吗?我已经为此工作了一段时间,到目前为止却空手而归。
我可以轻松地获取最后一个元素,并查看它的属性是否匹配。如果没有,我可以检查last-1,但是如何递归或使用内置函数呢?
在下面的示例中,父元素(MainRecord)具有3个属性(Data1,Data2,Data3),这些属性可能在那里或可能为空。子元素具有一个数据属性,该数据属性可以是也可以不是父数据属性之一。
因此对于RecordNumber = 1,我需要Cloud,因为Rainbow在父级中。记录3一直上升到阳光,因为花,云和彩虹都在父级中。
XML文件:
<MainRecord Data1="" Data2="" Data3="Rainbow" RecordNumber="1">
<AuditRecord Data="Sky" SomomethingElse="Hi"/>
<AuditRecord Data="Sunshine" SomomethingElse="Yo"/>
<AuditRecord Data="Flower" SomomethingElse="Do"/>
<AuditRecord Data="Cloud" SomomethingElse="Re"/>
<AuditRecord Data="Rainbow" SomomethingElse="Mi"/>
</MainRecord>
<MainRecord Data1="" Data2="Cloud" Data3="Rainbow" RecordNumber="2">
<AuditRecord Data="Sky" SomomethingElse="Hi"/>
<AuditRecord Data="Sunshine" SomomethingElse="Yo"/>
<AuditRecord Data="Flower" SomomethingElse="Do"/>
<AuditRecord Data="Cloud" SomomethingElse="Re"/>
<AuditRecord Data="Rainbow" SomomethingElse="Mi"/>
</MainRecord>
<MainRecord Data1="Flower" Data2="Cloud" Data3="Rainbow" RecordNumber="3">
<AuditRecord Data="Sky" SomomethingElse="Hi"/>
<AuditRecord Data="Sunshine" SomomethingElse="Yo"/>
<AuditRecord Data="Flower" SomomethingElse="Do"/>
<AuditRecord Data="Cloud" SomomethingElse="Re"/>
<AuditRecord Data="Rainbow" SomomethingElse="Mi"/>
</MainRecord>
<MainRecord Data1="Cloud" Data2="Flower" Data3="" RecordNumber="4">
<AuditRecord Data="Sky" SomomethingElse="Hi"/>
<AuditRecord Data="Sunshine" SomomethingElse="Yo"/>
<AuditRecord Data="Flower" SomomethingElse="Do"/>
<AuditRecord Data="Cloud" SomomethingElse="Re"/>
<AuditRecord Data="Rainbow" SomomethingElse="Mi"/>
</MainRecord>
<MainRecord Data1="" Data2="" Data3="" RecordNumber="5">
<AuditRecord Data="Sky" SomomethingElse="Hi"/>
<AuditRecord Data="Sunshine" SomomethingElse="Yo"/>
<AuditRecord Data="Flower" SomomethingElse="Do"/>
<AuditRecord Data="Cloud" SomomethingElse="Re"/>
<AuditRecord Data="Rainbow" SomomethingElse="Mi"/>
</MainRecord>
转换后所需的输出:
<MainRecord RecordNumber="1" MaxData="Cloud"/>
<MainRecord RecordNumber="2" MaxData="Flower"/>
<MainRecord RecordNumber="3" MaxData="Sunshine"/>
<MainRecord RecordNumber="4" MaxData="Rainbow"/>
<MainRecord RecordNumber="5" MaxData="Rainbow"/>
这是我在玩的。 maxData的变量不起作用,我确定这不是正确的方法,但我遇到了麻烦。
<MainRecords>
<xsl:for-each select="MainRecord">
<xsl:attribute name="RecordNumber"><xsl:value-of select="@RecordNumber"/></xsl:attribute>
<xsl:variable name="maxData"/>
<xsl:for-each select="AuditRecord">
<xsl:if test="not(@Data=@Data1) and not(@Data=@Data2) and not(@Data=@Data3)">
<xsl:variable name="maxDate"><xsl:value-of select="@Data"/></xsl:variable>
</xsl:if>
</xsl:for-each>
<xsl:attribute name="Count"><xsl:value-of select="count(AuditRecord)"/></xsl:attribute>
<xsl:attribute name="LastDataThatDoesntMatch"><xsl:value-of select="$maxDate"/></xsl:attribute>
<xsl:attribute name="Last"><xsl:value-of select="ItemAudit[last()]/@Date"/></xsl:attribute>
<xsl:attribute name="2ndLast"><xsl:value-of select="ItemAudit[last()-1]/@Date"/></xsl:attribute>
<xsl:attribute name="3rdLast"><xsl:value-of select="ItemAudit[last()-2]/@Date"/></xsl:attribute>
<xsl:attribute name="4thLast"><xsl:value-of select="ItemAudit[last()-3]/@Date"/></xsl:attribute>
</xsl:for-each>
</MainRecords>
感谢您的帮助。这显然不是实际数据,只是没有专有数据的问题的简单版本。不是学校项目,这是我第一次在项目中使用xslt,所以对我来说有点陌生。
答案 0 :(得分:2)
我想你只是想要
<xsl:template match="MainRecord">
<MainRecord RecordNumber="{@RecordNumber}" MaxData="{AuditRecord[not(@Data = current()/@*[starts-with(local-name(), 'Data')])][last()]/@Data}"/>
</xsl:template>