XSLT仅当存在Alternate_Cost_Center时修改Organization_Type取值的问题
问题根因
你当前的XSLT没有对Cost_Center的修改逻辑加前置判断,无论员工节点下是否存在Alternate_Cost_Center类型的组织,都会触发Cost_Center到Dummy_Cost_Center的替换,因此没有Alternate_Cost_Center的场景会出现误改。
修正方案
基于XSLT的身份转换模板做扩展,仅在满足判断条件时才做节点值修改:
- 首先保留默认身份转换模板,保证所有不需要修改的节点原样输出
<xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template>
- 新增两个针对性的匹配模板:
- 匹配值为
Alternate_Cost_Center的peci:Organization_Type,直接替换为Cost_Center - 匹配值为
Cost_Center的peci:Organization_Type时,增加判断条件:仅当所属员工节点下存在Alternate_Cost_Center类型的组织时,才替换为Dummy_Cost_Center,否则走默认逻辑原样输出
<!-- 替换Alternate_Cost_Center为Cost_Center --> <xsl:template match="peci:Organization_Type[. = 'Alternate_Cost_Center']"> <xsl:copy>Cost_Center</xsl:copy> </xsl:template> <!-- 仅当同员工下存在Alternate_Cost_Center时,才把原Cost_Center改为Dummy_Cost_Center --> <xsl:template match="peci:Organization_Type[. = 'Cost_Center'][ancestor::peci:Employee//peci:Organization_Type[. = 'Alternate_Cost_Center']]"> <xsl:copy>Dummy_Cost_Center</xsl:copy> </xsl:template>
注意:代码中的
ancestor::peci:Employee需要替换为你实际的员工节点标签,如果同员工的所有peci:Organization节点都在同一个直接父节点下,也可以把判断条件简化为../peci:Organization_Type[. = 'Alternate_Cost_Center']。
逻辑说明
修改后Cost_Center的替换逻辑仅在同员工节点存在Alternate_Cost_Center时才会触发,不存在的场景下该模板不会匹配,会走默认的身份转换逻辑输出原Cost_Center值,不会出现误改。
内容的提问来源于stack exchange,提问作者prashant adhikari
相关产品推荐
相关产品推荐

