XSLT3.0映射开发求助:移除含//CAN BE REMOVED//的Transmission段
解决XSLT3.0中删除指定Transmission段的问题
核心需求
当Transmission段的子段Transmission1内容包含//CAN BE REMOVED//时,删除整个Transmission段。
示例输入
<Root> <Transmission> <Transmission1>正常内容</Transmission1> <OtherData>数据1</OtherData> </Transmission> <Transmission> <Transmission1>测试内容//CAN BE REMOVED//测试内容</Transmission1> <OtherData>数据2</OtherData> </Transmission> <Transmission> <Transmission1>另一段正常内容</Transmission1> <OtherData>数据3</OtherData> </Transmission> </Root>
期望输出
<Root> <Transmission> <Transmission1>正常内容</Transmission1> <OtherData>数据1</OtherData> </Transmission> <Transmission> <Transmission1>另一段正常内容</Transmission1> <OtherData>数据3</OtherData> </Transmission> </Root>
正确XSLT3.0实现代码
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份转换模式:默认复制所有未被匹配的节点 --> <xsl:mode on-no-match="shallow-copy"/> <!-- 匹配需要过滤的Transmission元素,空模板实现删除 --> <xsl:template match="Transmission[contains(Transmission1, '//CAN BE REMOVED//')]"/> </xsl:stylesheet>
代码说明
- 身份转换模式:XSLT3.0的
<xsl:mode on-no-match="shallow-copy"/>替代了传统的身份转换模板,自动复制所有未被匹配的节点,大幅简化代码结构。 - 过滤逻辑:通过
match="Transmission[contains(Transmission1, '//CAN BE REMOVED//')]"精准定位符合删除条件的Transmission元素,空模板表示不输出该元素及其所有子节点,直接实现删除效果。
常见问题排查
如果你的代码未达到预期效果,可从以下方向排查:
- 字符串匹配问题:确认
contains()函数的参数是否准确,若需要忽略大小写,可修改为contains(upper-case(Transmission1), upper-case('//CAN BE REMOVED//')) - 节点路径错误:如果
Transmission1不是Transmission的直接子节点,需将路径调整为Transmission//Transmission1(适配深层嵌套场景) - 模板优先级冲突:若存在其他匹配
Transmission的模板,需确保当前过滤模板的优先级更高(当前写法的优先级已满足需求)
内容的提问来源于stack exchange,提问作者Bipul
相关产品推荐
相关产品推荐

