在xsl中比较for-each中的日期

时间:2015-08-11 14:47:23

标签: xml xslt

示例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”值与产品节点相关。 ProductRevision上的'masterRef'id 等于Product节点上的'id'值。 - Product节点通过'formRef'值与Form节点相关。 Product / AssociatedForm / formRef上的'formRef'id是 等于Form节点的'id'值。 在上面的例子中,我必须找到具有form_type'Class1'的ProductRevision的最新date_released(form_type value在Form节点中。

例如,要查找第一个ProductRevision节点是否为Class1类型: - 转到产品节点(id36)并获取其formRef id(id48) - product / AssociatedForm / formRef - 搜索id值为id48的表单xml节点。在Form节点中,获取form_type值并检查其是否为“Class1”。 - 如果是Class1,要获得date_released,我们必须转到相应的ProductRevision节点。 - 使用masterRef值搜索ProductRevision节点作为id36。从DateReleased形式获取ProductRevision节点。

我能够编写逻辑来遍历节点并检查form_type值并获取date_released,但仍坚持如何从这些节点获取最新的date_released。 要求是获取ProductRevision的最新date_released,并将form_type作为“Class1”。

1 个答案:

答案 0 :(得分:-1)

您最近的更新为您的问题带来了很多复杂性。我已经在这些步骤中重构了这个方法:

  1. UserValue个节点与form_type = Class1
  2. 匹配
  3. 将对应的AssociatedFormformRef匹配。
  4. 将对应的ProductRevisionmasterRef匹配,按标题= date_released的降序value进行排序。
  5. 获取结果列表的第一个元素。
  6. 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>