繁体   English   中英

比较XSL for-each中的日期

[英]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”。

您最近的更新给您的问题带来了很多复杂性。 我在以下步骤中重构了该方法:

  1. UserValue节点与form_type = Class1匹配
  2. 通过formRef匹配对应的AssociatedForm
  3. 匹配的通讯员ProductRevision通过masterRef ,通过降序排序value的标题= date_released的。
  4. 获取结果列表的第一个元素。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM