[英]Compare dates in for-each in xsl
样本XML:
<ProductRevision id="id38" name="Item1" accessRefs="#id4" subType="ItemRev" masterRef="#id36" revision="A">
<UserData id="id39">
<UserValue value="2015-08-11T16:46:20" title="date_released"></UserValue>
</UserData>
</ProductRevision>
<ProductRevision id="id53" name="Item2" accessRefs="#id4" subType="ItemRev" masterRef="#id51" revision="A">
<UserData id="id40">
<UserValue value="2015-08-07T13:57:42" title="date_released"></UserValue>
</UserData>
</ProductRevision>
<ProductRevision id="id68" name="Item2" accessRefs="#id4" subType="ItemRev" masterRef="#id66" revision="A">
<UserData id="id41">
<UserValue value="2015-08-06T13:57:42" title="date_released"></UserValue>
</UserData>
</ProductRevision>
<Product id="id36" name="Item1" accessRefs="#id4" subType="Item" productId="1234">
<ApplicationRef version="g7cVc2GTznicWC" application="Teamcenter" label="g7cVc2GTznicWC"></ApplicationRef>
<AssociatedForm id="id50" role="IMAN_master_form" formRef="#id48"></AssociatedForm>
</Product>
<Product id="id51" name="Item2" accessRefs="#id4" subType="Item" productId="BXU004846">
<ApplicationRef version="gLZVMV_wznicWC" application="Teamcenter" label="gLZVMV_wznicWC"></ApplicationRef>
<AssociatedForm id="id65" role="IMAN_master_form" formRef="#id63"></AssociatedForm>
</Product>
<Product id="id66" name="Item3" accessRefs="#id4" subType="Item" productId="BXU004848">
<ApplicationRef version="weVVMpxFznicWC" application="Teamcenter" label="weVVMpxFznicWC"></ApplicationRef>
<AssociatedForm id="id80" role="IMAN_master_form" formRef="#id78"></AssociatedForm>
</Product>
<Form id="id48" name="1234" accessRefs="#id4" subType="Item Master" subClass="Item Master">
<UserData id="id49" type="FormAttributes">
<UserValue value="Class1" title="form_type"></UserValue>
</UserData>
</Form>
<Form id="id63" name="BXU004846" accessRefs="#id4" subType="Item Master" subClass="Item Master">
<UserData id="id64" type="FormAttributes">
<UserValue value="Class1" title="form_type"></UserValue>
</UserData>
</Form>
<Form id="id78" name="BXU004848" accessRefs="#id4" subType="Item Master" subClass="Item Master">
<UserData id="id79" type="FormAttributes">
<UserValue value="Class2" title="form_type"></UserValue>
</UserData>
</Form>
在上述xml中,-ProductRevision节点通过'masterRef'值与Product Node相关。 ProductRevision上的“ masterRef” ID等于“产品”节点上的“ id”值。 -产品节点通过“ formRef”值与Form节点相关。 Product / AssociatedForm / formRef上的“ formRef” ID等于“表单”节点的“ id”值。 在上面的示例中,我必须查找具有form_type'Class1'的ProductRevision的最新date_released(form_type值位于Form节点中)。
例如,要查找第一个ProductRevision节点是否为Class1类型:-转到“产品”节点(id36)并获取其formRef id(id48)-product / AssociatedForm / formRef-搜索ID值为id48的Form xml节点。 在“表单”节点中,获取form_type值并检查其“ Class1”。 -如果是Class1,要获取date_released,我们必须转到相应的ProductRevision节点。 -搜索masterRef值为id36的ProductRevision节点。 从ProductRevision节点获取date_released。
我能够编写逻辑来遍历节点并检查form_type的值并获取date_released,但仍坚持如何从这些节点获取最新的date_released。 要求是获取productRevision的最新date_release,form_type为“ Class1”。
您最近的更新给您的问题带来了很多复杂性。 我在以下步骤中重构了该方法:
UserValue
节点与form_type = Class1匹配 formRef
匹配对应的AssociatedForm
。 ProductRevision
通过masterRef
,通过降序排序value
的标题= date_released的。 XSL:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="4.01" encoding="ISO-8859-1"/>
<xsl:template match="/root">
<html>
<body>
<!--Step 1-->
<xsl:apply-templates select="Form/UserData/UserValue[@title='form_type' and @value='Class1']"></xsl:apply-templates>
</body>
</html>
</xsl:template>
<xsl:template match="UserValue">
<!--Step 2-->
<xsl:variable name="refId">#<xsl:value-of select="../../@id"/></xsl:variable>
<xsl:apply-templates select="//AssociatedForm[@formRef=$refId]"/>
</xsl:template>
<xsl:template match="AssociatedForm">
<!--Step 3-->
<xsl:variable name="refId">#<xsl:value-of select="../@id"/></xsl:variable>
<xsl:variable name="datereleased"><xsl:apply-templates select="//ProductRevision[@masterRef=$refId]/UserData/UserValue[@title='date_released']" mode="max"><xsl:sort select="@value" data-type="text" order="descending"/></xsl:apply-templates></xsl:variable>
<p>datereleased=<xsl:value-of select="$datereleased"/></p>
</xsl:template>
<xsl:template match="UserValue" mode="max">
<!--Step 4-->
<xsl:if test="position()=1"><xsl:value-of select="@value"/></xsl:if>
</xsl:template>
</xsl:stylesheet>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.