我有以下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 < $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>
<!-- -->
需要你的输入。 感谢
答案 0 :(得分:-1)
上面提到的XSLT代码工作正常。存在数据问题。 干杯, 维基