我有一个初始XML:
<?xml version="1.0" encoding="UTF-8"?>
<pi:Payroll_Extract_Employees xmlns:pi="urn:com.workday/picof">
<pi:Header>
<pi:Updated_From>2017-09-07T02:23:04.000-07:00</pi:Updated_From>
</pi:Header>
<pi:Employee>
<pi:Summary>
<pi:Employee_ID>00000001</pi:Employee_ID>
</pi:Summary>
<pi:Time_Off>
<pi:Code_Name>WTR</pi:Code_Name>
<pi:Time_Off_Type>1260</pi:Time_Off_Type>
<pi:Time_Off_Date>2017-09-07</pi:Time_Off_Date>
<pi:Quantity>8</pi:Quantity>
<pi:Unit_of_Time>HOURS</pi:Unit_of_Time>
</pi:Time_Off>
<pi:Additional_Information>
<pi:Strike_1>11-sept.-2017,2 Hours=9570</pi:Strike_1>
</pi:Additional_Information>
</pi:Employee>
<pi:Employee>
<pi:Summary>
<pi:Employee_ID>00000002</pi:Employee_ID>
</pi:Summary>
<pi:Additional_Information>
<pi:Strike_1>22-sept.-2017,8 Hours=9570</pi:Strike_1>
<pi:Unjustified_Absence_1>25-sept.-2017,8 Hours=9700</pi:Unjustified_Absence_1>
</pi:Additional_Information>
</pi:Employee>
和XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
xmlns:pi="urn:com.workday/picof"
version="2.0">
<xsl:output indent="yes" method="xml"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<pi:Payroll_Extract_Employees>
<xsl:copy-of select="//pi:Header"/>
<xsl:for-each select="//pi:Employee">
<pi:Employee>
<xsl:copy-of select="pi:Summary"/>
<xsl:copy-of select="pi:Time_Off"/>
<xsl:apply-templates select="pi:Additional_Information/*"/>
</pi:Employee>
</xsl:for-each>
</pi:Payroll_Extract_Employees>
</xsl:template>
<xsl:template match="pi:Additional_Information/*">
<xsl:apply-templates select="ancestor::pi:Payroll_Extract_Employees">
<xsl:with-param name="UnpaidTO" select="current()"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="pi:Payroll_Extract_Employees">
<xsl:param name="UnpaidTO"/>
<pi:Time_Off>
<pi:Code_Name>Unpaid Time Off</pi:Code_Name>
<pi:Time_Off_Type><xsl:value-of select="substring-after($UnpaidTO,'=')"/></pi:Time_Off_Type>
<pi:Time_Off_Date><xsl:value-of select="substring-before($UnpaidTO,',')"/></pi:Time_Off_Date>
<pi:Quantity><xsl:value-of select="substring-before(substring-after($UnpaidTO,','),' ')"/></pi:Quantity>
<pi:Unit_of_Time><xsl:value-of select="substring-after(substring-before($UnpaidTO,'='),' ')"/></pi:Unit_of_Time>
</pi:Time_Off>
</xsl:template>
</xsl:stylesheet>
到目前为止,代码进展顺利。但在最终输出中,我想更改 pi:Time_Off_Date 的日期格式,其格式不是yyyy-MM-dd。如初始XML中所示,它的格式为dd-MMM-yyyy。日期是法语,因此MMM可以是:
janv。 FEVR。 火星 艾薇儿 迈 朱安 JUIL。 AOUT 七重峰 倍频程 十一月 分解
所以它应该是 01 02 03 04 05 06 07 08 09 10 11 12 分别
因此所有 pi:Time_Off_Date 的最终输出将为yyyy-MM-dd。
我尝试添加以下代码。但似乎没有任何事情发生。有什么方法可以做到吗?真的需要帮助。谢谢!
<xsl:template match="pi:Time_Off_Date">
<xsl:copy>
<xsl:call-template name="TODate">
<xsl:with-param name="dd-mmm-yyyy" select="."/>
</xsl:call-template>
</xsl:copy>
</xsl:template>
<xsl:template name="TODate">
<xsl:param name="dd-mmm-yyyy"/>
<xsl:variable name="dd" select="substring-before($dd-mmm-yyyy, '-')"/>
<xsl:variable name="mmm-yyyy" select="substring-after($dd-mmm-yyyy, '-')"/>
<xsl:variable name="mmm" select="substring-before($mmm-yyyy, '-')"/>
<xsl:variable name="yyyy" select="substring-after($mmm-yyyy, '-')"/>
<xsl:value-of select="$yyyy"/>
<xsl:choose>
<xsl:when test="$mmm = 'janv.'">01</xsl:when>
<xsl:when test="$mmm = 'févr.'">02</xsl:when>
<xsl:when test="$mmm = 'mars'">03</xsl:when>
<xsl:when test="$mmm = 'avril'">04</xsl:when>
<xsl:when test="$mmm = 'mai'">05</xsl:when>
<xsl:when test="$mmm = 'juin'">06</xsl:when>
<xsl:when test="$mmm = 'juil.'">07</xsl:when>
<xsl:when test="$mmm = 'août'">08</xsl:when>
<xsl:when test="$mmm = 'sept.'">09</xsl:when>
<xsl:when test="$mmm = 'oct'">10</xsl:when>
<xsl:when test="$mmm = 'nov.'">11</xsl:when>
<xsl:when test="$mmm = 'déc.'">12</xsl:when>
</xsl:choose>
<xsl:value-of select="$dd"/>
</xsl:template>
答案 0 :(得分:0)
你的pi:Time_Off_Date模板没有对输出产生任何影响的直接原因是你的样式表中没有调用xsl:apply-templates会导致评估该模板。
您的样式表将通过评估匹配/的模板开始执行,该模板生成一个pi:Payroll_Extract_Employees元素,将所有pi:Header元素复制到其中,并为每个pi生成一个pi:Employee元素:输入中的Employee。在输出pi:Employee元素中,您将获得任何pi的未更改副本:Summary和pi:Time_Off元素,它们显示为相应输入pi的子元素:Employee元素,以及任何pi的任何子元素:输入pi的Additional_Information子元素:Employee元素将由匹配模板处理。反过来,这会在祖先pi:Payroll_Extract_Employees元素上调用xsl:apply-templates。
如果您插入
<xsl:message>Hi!</xsl:message>
进入pi:Time_Off_Date的模板,您可以轻松确认自己没有被调用:您将看不到任何嗨!评估样式表时的消息。
您可能会发现阅读XSLT中'push'和'pull'样式处理之间的区别并尝试转向更加面向推送的风格是有帮助的;现在你的样式表主要是拉式,这意味着添加模板以产生新的行为通常没有效果。
但是,您应该注意(特别是如果您转换为推式转换),yyyy-mm-dd格式的第一个pi:Time_Off_Date 的实例并且不需要更改。我认为你可以在你的代码中检查转换日期格式,输入是你的模板所期望的格式。
(XSLT 2.0的某些用户可能也更愿意使用函数而不是命名模板来执行此操作,但我认为您对命名模板没问题。)