我有以下源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>
答案 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>