在多结构xml比较值和更新xml字段

时间:2017-08-03 15:32:05

标签: xml xslt-2.0 composite

我有以下xml

<Messages>
<Message1>
    <EmpLDU>
        <Row>
            <Emp_id>325132 </Emp_id>
            <Pay_Group>AUS_NI102</Pay_Group>
            <Date_from_ec>20170814</Date_from_ec>
            <Date_to_ec>20170816</Date_to_ec>           
            <Counter>1</Counter>
        </Row>
        <Row>
            <Emp_id>1 </Emp_id>
            <Pay_Group>AUS_NI102</Pay_Group>
            <Date_from_ec>20170720</Date_from_ec>
            <Date_to_ec>20170720</Date_to_ec>
            <Counter>1</Counter>
        </Row>
    </EmpLDU>
</Message1>
<Message2>
    <PayCalendar>
        <PayCalendar>       
            <toPayPeriod>
                <PayPeriod>
                    <PayCalendar_payGroup>AUS_NI102</PayCalendar_payGroup>
                    <payPeriodBeginDate>2016-08-01T00:00:00.000</payPeriodBeginDate>
                    <payPeriodEndDate>2016-08-31T00:00:00.000</payPeriodEndDate>
                    <payCheckIssueDate>2016-08-15T00:00:00.000</payCheckIssueDate>
                    <externalCode>1297</externalCode>
                </PayPeriod>
                <PayPeriod>
                    <PayCalendar_payGroup>AUS_NI102</PayCalendar_payGroup>
                    <payPeriodBeginDate>2016-07-01T00:00:00.000</payPeriodBeginDate>
                    <payPeriodEndDate>2016-07-31T00:00:00.000</payPeriodEndDate>
                    <payCheckIssueDate>2016-07-15T00:00:00.000</payCheckIssueDate>
                    <externalCode>1296</externalCode>
                </PayPeriod>
            </toPayPeriod>
        </PayCalendar>
        <PayCalendar>
            <toPayPeriod>
                <PayPeriod>
                    <PayCalendar_payGroup>ARE_M01</PayCalendar_payGroup>
                    <payPeriodBeginDate>2017-12-01T00:00:00.000</payPeriodBeginDate>
                    <payPeriodEndDate>2017-12-31T00:00:00.000</payPeriodEndDate>
                    <payCheckIssueDate>2017-12-25T00:00:00.000</payCheckIssueDate>
                    <externalCode>1237</externalCode>
                </PayPeriod>
                <PayPeriod>
                    <PayCalendar_payGroup>ARE_M01</PayCalendar_payGroup>
                    <payPeriodBeginDate>2017-11-01T00:00:00.000</payPeriodBeginDate>
                    <payPeriodEndDate>2017-11-30T00:00:00.000</payPeriodEndDate>
                    <payCheckIssueDate>2017-11-25T00:00:00.000</payCheckIssueDate>
                    <externalCode>1236</externalCode>
                </PayPeriod>
            </toPayPeriod>
        </PayCalendar>
    </PayCalendar>
    <Message2><Messages>

我需要输出以下信息

<EmpLDU>
        <Row>
            <Emp_id>325132 </Emp_id>
            <Date_from_ec>20170814</Date_from_ec>
            <Date_to_ec>20170816</Date_to_ec>
        </Row>
        <Row>
            <Emp_id>1 </Emp_id>
            <Date_from_ec>20170720</Date_from_ec>
            <Date_to_ec>20170720</Date_to_ec>
        </Row></EmpLDU>

当参考消息2&gt;更新字段Date_from_ec时。 PayPeriod节点(当前月份存在payCheckIssueDate的节点) 那么如果payPeriodBeginDate比Date_from_ec更好,那么

  

需要使用payPeriodBeginDate更新Date_from_ec的值,否则保留现有值。

类似地 参考消息2&gt;更新字段Date_from_ec。 PayPeriod节点(当前月份存在payCheckIssueDate的节点) 然后,如果payPeriodBeginDate小于Date_to_ec那么

  

需要使用payPeriodEndDate更新Date_to_ec的值,否则保留现有值。

我开发了以下代码,但没有开心:

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/02/xpath-functions" xmlns:xdt="http://www.w3.org/2005/02/xpath-datatypes"
exclude-result-prefixes="xsl xs fn xdt">
<xsl:output method="xml" version="1.0" encoding="utf-8"
    indent="yes" omit-xml-declaration="yes" />

<xsl:variable name="Current_Date">
    <xsl:value-of select="format-date(current-date(), '[Y0001][M01][D01]')" />
</xsl:variable>
<xsl:variable name="Current_MonthYear">
    <xsl:value-of select="substring($Current_Date, 1, 6)" />
</xsl:variable>

<!-- template that matches the root node -->
<xsl:template match="/">
    <EmpLDU>
        <xsl:for-each select="EmpLDU/Row[Pay_Group !='']">

            <xsl:variable name="v_Pay_Group" select="Pay_Group" />
            <xsl:variable name="v_Date_from_ec" select="Date_from_ec" />
            <xsl:variable name="v_Date_to_ec" select="Date_to_ec" />

            <Row>
                <Emp_id>
                    <xsl:value-of select="Emp_id" />
                </Emp_id>
                <xsl:variable name="v_payPeriodBeginDate">
                    <xsl:for-each select="Messages/Message2/PayCalendar/PayCalendar[payGroup = $v_Pay_Group]">
                        <xsl:for-each select="toPayPeriod/PayPeriod">   
                            <xsl:variable name="v_payCheckIssueDate">
                                <xsl:value-of select="format-dateTime(payCheckIssueDate, '[Y0001][M01][D01]')" />
                            </xsl:variable>
                            <xsl:variable name="v_payCheckIssue_MonthYear">
                                <xsl:value-of select="substring($v_payCheckIssueDate, 1, 6)" />
                            </xsl:variable>

                            <xsl:if test="$Current_MonthYear = $v_payCheckIssue_MonthYear" >
                                <xsl:value-of select="format-dateTime(payPeriodBeginDate, '[Y0001][M01][D01]')" />                          
                            </xsl:if>
                        </xsl:for-each>
                    </xsl:for-each>
                </xsl:variable>
                <xsl:variable name="v_payPeriodEndDate">
                    <xsl:for-each select="Messages/Message2/PayCalendar/PayCalendar[payGroup = $v_Pay_Group]">
                        <xsl:for-each select="toPayPeriod/PayPeriod">   
                            <xsl:variable name="v_payCheckIssueDate">
                                <xsl:value-of select="format-dateTime(payCheckIssueDate, '[Y0001][M01][D01]')" />
                            </xsl:variable>
                            <xsl:variable name="v_payCheckIssue_MonthYear">
                                <xsl:value-of select="substring($v_payCheckIssueDate, 1, 6)" />
                            </xsl:variable>

                            <xsl:if test="$Current_MonthYear = $v_payCheckIssue_MonthYear" >
                                <xsl:value-of select="format-dateTime(payPeriodEndDate, '[Y0001][M01][D01]')" />                                    
                            </xsl:if>
                        </xsl:for-each>
                    </xsl:for-each>
                </xsl:variable>
                <Date_from_ec>
                    <xsl:choose>
                        <xsl:when test="$v_Date_from_ec &lt; $v_payPeriodBeginDate">
                            <xsl:value-of select="$v_payPeriodBeginDate"/>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select="$v_Date_from_ec" />
                        </xsl:otherwise>
                    </xsl:choose>
                </Date_from_ec>
                <Date_to_ec>
                    <xsl:choose>
                        <xsl:when test="$v_Date_to_ec &gt; $v_payPeriodEndDate">
                            <xsl:value-of select="$v_payPeriodEndDate"/>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select="$v_Date_to_ec" />
                        </xsl:otherwise>
                    </xsl:choose>
                </Date_to_ec>               
            </Row>
        </xsl:for-each>
    </EmpLDU>
</xsl:template>
<!-- -->

需要你的输入。 感谢

1 个答案:

答案 0 :(得分:-1)

上面提到的XSLT代码工作正常。存在数据问题。 干杯, 维基