将值从一个模板传递到另一个模板

时间:2017-07-27 21:14:26

标签: xslt-1.0

我正在尝试将值从一个模板传递到另一个模板。虽然我在这个论坛中找到了几个例子,但我根本无法做到。

以下是我的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模板中有一个param值,并将该param传递给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>

1 个答案:

答案 0 :(得分:0)

&#34; 在缺少select属性的情况下,xsl:apply-templates指令处理当前节点[...] &#34;的所有子节点。 (W3C)。 这意味着您匹配<Start_Date>的模板无法在<Compensation_Effective_Date>的上下文中生效,因为其中没有<Start_Date>子元素。 相反,<Start_Date>模板 - 与其他模板一样 - 只匹配内容并在没有参数的情况下应用,这就是输出中<Start_Date>为空的原因。

我无法以你想要的方式工作,但我可能会有一些提示让你去。 对于以下代码片段,请注意我删除了pi:namespace,因为它在我的编辑器中引起了麻烦。

1。)简易解决方案

即使它在当前上下文之外,也可以简单地引用所需的源元素。这将产生所需的输出:

<xsl:template match="Start_Date">
    <Start_Date><xsl:value-of select="../../Position/Compensation_Effective_Date"/></Start_Date>
</xsl:template>

但要小心使用它,例如如果员工可以有多个职位要素。

2.)使用<xls:call-template>和参数

我调整了&#34; call-template-syntax&#34;来自this answer以适合您的榜样。

<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>

参数被传送到模板&#34; t&#34;成功并出现在输出中,但不是在正确的位置。 现在问题是进入正确的上下文并在那里插入标签。 也许有人可以在此基础上构建并使用参数提供可行的解决方案。