XSLT基于子的不同模板

时间:2016-03-25 14:15:17

标签: xml xslt

我有以下源XML,我必须转换才能导入会计软件。简而言之,生成的XML应该有一个静态头和多行(源XML上每个项目分类行一行)。我想为费用和时间表选择不同的模板,因为会计分录有很多不同之处。一个例子是帐户代码。以下示例仅用于简化以区分帐户代码,但也存在许多其他差异。我在当前转换中遇到的问题是我只得到一行而不是2行,因为某种原因会忽略一行。请帮忙,

谢谢,

您可以在此处访问此项目: http://xsltransform.net/jyRYYjg/1

源XML:

<?xml version="1.0" encoding="utf-8"?>
    <TIMEATWORK xsl:version="1.0" server="localhost" database="TAW_TTC" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <PROJECT_LEDGER_LINE>
            <CalcVal11>600</CalcVal11>
            <Orig_Trans_Type>TIMESHEET</Orig_Trans_Type>
            <Project_Company_Accounts>
                  <Proj_AccName1>70600000</Proj_AccName1>
                  <Proj_AccName2>46141101</Proj_AccName2>
            </Project_Company_Accounts>
        </PROJECT_LEDGER_LINE>
        <PROJECT_LEDGER_LINE>
            <CalcVal11>50</CalcVal11>
            <Orig_Trans_Type>EXPENSE</Orig_Trans_Type>
            <Project_Company_Accounts>
                  <Proj_AccName1>70600000</Proj_AccName1>
                  <Proj_AccName2>46141101</Proj_AccName2>
            </Project_Company_Accounts>
        </PROJECT_LEDGER_LINE>
    </TIMEATWORK>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:user="http://llpgroup.com/TAWnamespace"
    exclude-result-prefixes="msxsl user" >
    <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes" />

    <xsl:template match="TIMEATWORK">
    <SSC>
        <Header>
            <BudgetCode>A</BudgetCode>
        </Header>
        <Details>
            <Ledger>
                <xsl:apply-templates select="PROJECT_LEDGER_LINE">
                    <xsl:sort select="Orig_Trans_Type"/>
                </xsl:apply-templates>
            </Ledger>
        </Details>
    </SSC>

    </xsl:template>

    <xsl:template match="PROJECT_LEDGER_LINE">  
    <xsl:if test="Orig_Trans_Type = 'TIMESHEET'">
        <Line>
            <AccountCode><xsl:value-of select="Project_Company_Accounts/Proj_AccName1"/></AccountCode>
            <CurrencyCode><xsl:value-of select="CalcVal11"/></CurrencyCode>
            <DebitCredit>D</DebitCredit>
        </Line>
    </xsl:if>
    </xsl:template>

    <xsl:template match="PROJECT_LEDGER_LINE">  
    <xsl:if test="Orig_Trans_Type = 'EXPENSE'">
        <Line>
            <AccountCode><xsl:value-of select="Project_Company_Accounts/Proj_AccName2"/></AccountCode>
            <CurrencyCode><xsl:value-of select="CalcVal11"/></CurrencyCode>
            <DebitCredit>D</DebitCredit>
        </Line>
    </xsl:if>
    </xsl:template>

</xsl:stylesheet>

期望的输出:

<?xml version="1.0" encoding="utf-8"?>
<SSC>
   <Header>
      <BudgetCode>A</BudgetCode>
   </Header>
   <Details>
      <Ledger>
           <Line>
            <AccountCode>70600000</AccountCode>
            <CurrencyCode>600</CurrencyCode>
            <DebitCredit>D</DebitCredit>
         </Line>
         <Line>
            <AccountCode>46141101</AccountCode>
            <CurrencyCode>50</CurrencyCode>
            <DebitCredit>D</DebitCredit>
         </Line>
      </Ledger>
   </Details>
</SSC>

1 个答案:

答案 0 :(得分:1)

如果有两个(或更多)模板匹配同一节点,则只应用其中一个模板。

如果您希望将每个模板应用于同一节点的不同类型,请使用谓词而不是xsl:if,例如:

<xsl:template match="PROJECT_LEDGER_LINE[Orig_Trans_Type = 'TIMESHEET']">  
    <Line>
        <AccountCode><xsl:value-of select="Project_Company_Accounts/Proj_AccName1"/></AccountCode>
        <CurrencyCode><xsl:value-of select="CalcVal11"/></CurrencyCode>
        <DebitCredit>D</DebitCredit>
    </Line>
</xsl:template>

<xsl:template match="PROJECT_LEDGER_LINE[Orig_Trans_Type = 'EXPENSE']">  
    <Line>
        <AccountCode><xsl:value-of select="Project_Company_Accounts/Proj_AccName2"/></AccountCode>
        <CurrencyCode><xsl:value-of select="CalcVal11"/></CurrencyCode>
        <DebitCredit>D</DebitCredit>
    </Line>
</xsl:template>