首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于子模板的XSLT不同模板

基于子模板的XSLT不同模板
EN

Stack Overflow用户
提问于 2016-03-25 14:15:16
回答 1查看 35关注 0票数 0

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

谢谢,

这是您可以访问该项目的地方:http://xsltransform.net/jyRYYjg/1

源XML:

代码语言:javascript
复制
<?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:

代码语言:javascript
复制
<?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>

期望产出:

代码语言:javascript
复制
<?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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-25 14:28:20

当有两个(或多个)模板匹配同一个节点时,将只应用其中一个模板。

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

代码语言:javascript
复制
<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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36221627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档