我有下面的XML在多結構XML -comparing值和更新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>
其中場Date_from_ec在參考被更新消息2> PayPeriod節點(其中一個在當月存在payCheckIssueDate) 那麼如果payPeriodBeginDate大於Date_from_ec那麼
Date_from_ec的值需要使用payPeriodBeginDate更新,否則保持現有值。
同樣 領域Date_from_ec在參考與消息2> PayPeriod節點(一個已payCheckIssueDate當月existsing) 那麼如果payPeriodBeginDate小於Date_to_ec然後
更新Date_to_ec的值需要用payPeriodEndDate更新,否則保持現有的值。
我已經開發出了下面的代碼,但沒有喜悅:
<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 < $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 > $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>
<!-- -->
需要你輸入。 謝謝
您可能想要將示例數據減少到相關數據來回答問題。輸入代碼段中的日期字段和所顯示的所需輸出片段中是否有任何更改?我不確定我注意到這些領域的變化。 –
你好馬丁,我已經把問題修剪成最大的相關性。是的,這是必需的功能 - 其中 - Date_from_ec和Date_to_ec等字段需要根據xml -message2中的字段進行計算。用我的代碼,我得到了Date_from_ec的值,但奇怪的是Date_to_ec是空的。 – Vicky
如果參考消息2> PayPeriod節點(其中一個在當月存在payCheckIssueDate)更新字段Date_from_ec ,那麼如果payPeriodBeginDate大於Date_from_ec然後是 >則需要使用payPeriodBeginDate更新Date_from_ec的值否則保持現有值。 – Vicky