我正在尝试将值从一个模板传递到另一个模板。虽然我在这个论坛上找到了几个例子,但我根本无法做到。
下面是我的 XML:
<pi:PayGroup xmlns:pi="urn:com.sample/file">
<pi:Header>
<pi:Version>17</pi:Version>
<pi:Payroll_Company_Name>ABCD</pi:Payroll_Company_Name>
<pi:Pay_Group_ID>0307</pi:Pay_Group_ID>
</pi:Header>
<pi:Employee>
<pi:Summary>
<pi:Employee_ID>12345678</pi:Employee_ID>
<pi:Name>Test Employee</pi:Name>
</pi:Summary>
<pi:Position>
<pi:Business_Title>Lead Learning Specialist</pi:Business_Title>
<pi:Worker_Type>P</pi:Worker_Type>
<pi:Position_Time_Type>Full_time</pi:Position_Time_Type>
<pi:Compensation_Effective_Date>2017-07-01</pi:Compensation_Effective_Date>
<pi:Base_Pay_Currency>EUR</pi:Base_Pay_Currency>
<pi:Base_Pay_Frequency>4-Weekly</pi:Base_Pay_Frequency>
<pi:Organization_One>0307_3075999496</pi:Organization_One>
<pi:Organization_Two>0307</pi:Organization_Two>
<pi:Supervisor_ID>00295975</pi:Supervisor_ID>
<pi:Supervisor_Name>Simba Sang (98765432)</pi:Supervisor_Name>
</pi:Position>
<pi:Earnings>
<pi:Start_Date>2017-02-06</pi:Start_Date>
<pi:Currency>EUR</pi:Currency>
</pi:Earnings>
</pi:Employee>
</pi:PayGroup>
下面是长期使用的 XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pi="urn:com.workday/picof"
version="2.0">
<xsl:output omit-xml-declaration="yes" method="xml"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- 00123456 ... 123456 -->
<xsl:template match="pi:Employee_ID">
<pi:Employee_ID>
<xsl:value-of select="substring(.,3)"/>
</pi:Employee_ID>
</xsl:template>
<xsl:template match="pi:Supervisor_ID">
<pi:Supervisor_ID>
<xsl:value-of select="substring(.,3)"/>
</pi:Supervisor_ID>
</xsl:template>
<xsl:template match="pi:Supervisor_Name">
<pi:Supervisor_Name>
<xsl:value-of select="normalize-space(substring-before(.,'('))"/>
</pi:Supervisor_Name>
</xsl:template>
<xsl:template match="pi:Organization_One">
<pi:Organization_One>
<xsl:value-of select="if(contains(.,'_'))
then(normalize-space(substring-after(.,'_')))
else(.)"/>
</pi:Organization_One>
</xsl:template>
</xsl:stylesheet>
这里的问题是/pi:position/pi:Compensation_Effective_Date 值也应该在/pi:Earnings_Deductions/pi:Start_Date 标签下传递
pi:Start_Date 的值应与 pi:Compensation_Effective_Date 相同。
因此,我修改了 XSLT 以包含另外两个模板匹配项,一个用于 pi:Compensation_Effective_Date,另一个用于/pi:Start_Date,如下所示:
<xsl:template match="/pi:Compensation_Effective_Date">
<xsl:param name="test"/>
<xsl:apply-templates>
<xsl:with-param name="test" select="."/>
</xsl:apply-templates>
<pi:Compensation_Effective_Date><xsl:value-of select="$test"/></pi:Compensation_Effective_Date>
</xsl:template>
<xsl:template match="pi:Start_Date">
<xsl:param name="test"/>
<pi:Start_Date><xsl:value-of select="$test"/></pi:Start_Date>
</xsl:template>
在 pi:compensation_effective_date 模板中有一个参数值,并将该参数传递给 pi:start_date 模板。但是 pi:Start_Date 始终是空白的;我怎样才能在start_date中获得compensation_effective_Date价值?
预期输出:
<pi:Position>
<pi:Business_Title>...</pi:Business_Title>
<pi:Worker_Type>..</pi:Worker_Type>
<pi:Position_Time_Type>..</pi:Position_Time_Type>
<pi:Compensation_Effective_Date>2017-07-01</pi:Compensation_Effective_Date>
<pi:Base_Pay_Currency>..</pi:Base_Pay_Currency>
<pi:Base_Pay_Frequency>...</pi:Base_Pay_Frequency>
<pi:Organization_One>....</pi:Organization_One>
<pi:Organization_Two>....</pi:Organization_Two>
<pi:Supervisor_ID>....</pi:Supervisor_ID>
<pi:Supervisor_Name>.....</pi:Supervisor_Name>
</pi:Position>
<pi:Earnings>
<pi:Start_Date>2017-07-01</pi:Start_Date>
<pi:Currency>...</pi:Currency>
</pi:Earnings>
">在没有 select 属性的情况下,xsl:apply-templates
指令处理当前节点 [...]"(W3C(。 这意味着模板匹配<Start_Date>
无法在<Compensation_Effective_Date>
上下文中工作,因为其中没有<Start_Date>
子元素。 相反,<Start_Date>
模板(与其他模板一样(仅匹配内容并在没有参数的情况下应用,这就是输出中<Start_Date>
为空的原因。
我无法让它按照你打算的方式工作,但我可能会有一些提示让你继续前进。 对于以下代码片段,请注意,我删除了 pi: 命名空间,因为它在我的编辑器中造成了麻烦。
1.( 简单的解决方案
可以简单地引用所需的源元素,即使它位于当前上下文之外。这将产生所需的输出:
<xsl:template match="Start_Date">
<Start_Date><xsl:value-of select="../../Position/Compensation_Effective_Date"/></Start_Date>
</xsl:template>
但是,请小心使用它,例如,如果员工可以有多个职位元素。
2.( 使用<xls:call-template>
和参数
我调整了此答案中的"调用模板语法"以适应您的示例。
<xsl:template match="Employee">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
<xsl:call-template name="t">
<xsl:with-param name="p" select="Position/Compensation_Effective_Date"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="t">
<xsl:param name="p"/>
<Start_Date><xsl:value-of select="$p"/></Start_Date>
</xsl:template>
参数成功传输到模板"t"并显示在输出中,但不在正确的位置。 现在的问题是进入正确的上下文并在那里插入标签。 也许有人可以在此基础上构建并使用参数提供有效的解决方案。