我的输入xml如下
<ns0:ProjectSync xmlns:ns0="http://XSLMapTesting.ProjectSync">
<Funder>
<OID>1</OID>
<FFC>FFC1</FFC>
</Funder>
<Funder>
<OID>2</OID>
<FFC></FFC>
</Funder>
<Funder>
<OID>3</OID>
<FFC>FFC3</FFC>
</Funder>
<Funder>
<OID>4</OID>
<FFC></FFC>
</Funder>
<ActiveBudget>
<BudgetLines>
<Fund>
<ID>1</ID>
</Fund>
</BudgetLines>
<BudgetLines>
<Fund>
<ID>4</ID>
</Fund>
</BudgetLines>
</ActiveBudget>
</ns0:ProjectSync>
我的映射xslt代码如下
<xsl:template match="/">
<xsl:apply-templates select="/s0:ProjectSync" />
</xsl:template>
<!--
////////////////////////////////////////
ProjectSync template
////////////////////////////////////////
-->
<xsl:template match="/s0:ProjectSync">
<ns0:Projects>
<Project>
<Funders>
<xsl:apply-templates select="Funder[*]" />
</Funders>
<Budgets>
<xsl:apply-templates select="ActiveBudget/BudgetLines[*]" />
</Budgets>
</Project>
</ns0:Projects>
</xsl:template>
<!--
////////////////////////////////////////
Funders template
////////////////////////////////////////
-->
<xsl:template match="Funder">
<Funder>
<ID>
<xsl:choose>
<xsl:when test="FFC != ''">
<xsl:value-of select="FFC/text()"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="OID/text()" />
</xsl:otherwise>
</xsl:choose>
</ID>
</Funder>
</xsl:template>
<!--
////////////////////////////////////////
BudgetLines template
////////////////////////////////////////
-->
<xsl:template match="ActiveBudget/BudgetLines">
<BudgetLine>
<FundID>
<xsl:value-of select="Fund/ID/text()" />
</FundID>
</BudgetLine>
</xsl:template>
</xsl:stylesheet>
在上面的“BudgetLines 模板”中,我想应用一个逻辑,例如对于每个预算线,它都会迭代资助者记录集,并查看是否找到具有相同 ID 的资助者并且还填充了 FFC,然后应该映射 FFC。否则,基金/ID 应映射到输出 xml 中。下面的代码也定义了同样的逻辑:
for-each select="BudgetLine"
for-each select="Funder"
choose
when test="BudgetLine/Fund/ID = Funder/OID & Funder/FFC != ''"
<xsl:value-of select="Funder/FFC/text()" />
break;
otherwise
<xsl:value-of select="BudgetLine/Fund/ID/text()" />
上述 xml 的预期输出应如下所示
<ns0:Projects xmlns:ns0="http://XSLMapTesting.Projects">
<Project>
<Funders>
<Funder>
<ID>FFC1</ID>
</Funder>
<Funder>
<ID>2</ID>
</Funder>
<Funder>
<ID>FFC3</ID>
</Funder>
<Funder>
<ID>4</ID>
</Funder>
</Funders>
<Budgets>
<BudgetLine>
<FundID>FFC1</FundID>
</BudgetLine>
<BudgetLine>
<FundID>4</FundID>
</BudgetLine>
</Budgets>
</Project>
</ns0:Projects>
我该如何在 xsl 中实现这一点? 谢谢你
如果我正确理解您的要求,我建议您这样做:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="funder" match="Funder" use="OID" />
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Funder">
<xsl:copy>
<ID>
<xsl:choose>
<xsl:when test="FFC/text()">
<xsl:value-of select="FFC"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="OID"/>
</xsl:otherwise>
</xsl:choose>
</ID>
</xsl:copy>
</xsl:template>
<xsl:template match="ActiveBudget">
<Budgets>
<xsl:apply-templates/>
</Budgets>
</xsl:template>
<xsl:template match="BudgetLines">
<xsl:variable name="funder" select="key('funder', Fund/ID)" />
<BudgetLine>
<FundID>
<xsl:choose>
<xsl:when test="$funder/FFC/text()">
<xsl:value-of select="$funder/FFC"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$funder/OID"/>
</xsl:otherwise>
</xsl:choose>
</FundID>
</BudgetLine>
</xsl:template>
</xsl:stylesheet>