编写XSLT:在fund_code_type_required后添加intermediary元素(不存在时)
需求与解决方案
现有XML结构
<request_scope> <valuation_currency>GBP</valuation_currency> <fund_code_type_required>FUND1</fund_code_type_required> <valuation_request type="Current"/> <valuation_request type="Surrender"/> <fund_breakdown_request>yes</fund_breakdown_request> </request_scope>
转换目标
仅当<request_scope>下不存在<intermediary>元素时,在<fund_code_type_required>的紧后方添加空的<intermediary>元素,转换后结果如下:
<request_scope> <valuation_currency>GBP</valuation_currency> <fund_code_type_required>FUND1</fund_code_type_required> <intermediary></intermediary> <valuation_request type="Current"/> <valuation_request type="Surrender"/> <fund_breakdown_request>yes</fund_breakdown_request> </request_scope>
实现XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份模板:默认复制所有节点和属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 专门处理fund_code_type_required元素 --> <xsl:template match="fund_code_type_required"> <!-- 先复制当前元素 --> <xsl:copy-of select="."/> <!-- 检查父节点request_scope下是否没有intermediary元素 --> <xsl:if test="not(../intermediary)"> <intermediary/> </xsl:if> </xsl:template> </xsl:stylesheet>
代码说明
- 身份模板:负责原样复制XML中所有未被特殊模板匹配的节点和属性,保证原有结构大部分不变。
- fund_code_type_required专属模板:
- 先复制自身到输出结果中;
- 通过
not(../intermediary)判断父节点<request_scope>下是否不存在<intermediary>元素,若不存在则输出空的<intermediary>元素。
- 如果原XML中已经存在
<intermediary>元素,这段XSLT不会做任何额外添加,完全保留原有结构。
内容的提问来源于stack exchange,提问作者user3417479
相关产品推荐
相关产品推荐

