我有以下的源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>发布于 2016-03-25 14:28:20
当有两个(或多个)模板匹配同一个节点时,将只应用其中一个模板。
如果希望将每个模板应用于同一节点的不同类型,请使用谓词而不是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>https://stackoverflow.com/questions/36221627
复制相似问题