如何在XSLT样式表中添加<FLAG>元素前缀过滤规则?
修改后的XSLT方案
要实现只导入<FLAG>元素值以ABC开头的XML数据,同时保留原有的FLAG值截断功能,你可以这样修改样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <!-- 基础复制模板:默认处理所有节点的复制逻辑 --> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <!-- 过滤Record节点:仅保留FLAG以ABC开头的记录 --> <xsl:template match="Record"> <xsl:if test="starts-with(normalize-space(ItemMaster/FLAG), 'ABC')"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:if> </xsl:template> <!-- 保留原有的FLAG值截断逻辑 --> <xsl:template match="ZBE14_OEMs_ItemUpdate_OUT/Record/ItemMaster/FLAG"> <xsl:copy> <xsl:apply-templates select="@*" /> <xsl:value-of select="substring(normalize-space(), 1, 19)"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
关键改动说明:
- 新增了
<Record>节点的匹配模板,通过starts-with(normalize-space(ItemMaster/FLAG), 'ABC')做条件判断:normalize-space用来处理FLAG值前后可能存在的空格,避免因空格导致匹配失效starts-with函数精准检查FLAG值是否以ABC开头
- 只有符合条件的Record才会被复制并继续处理其子节点,不符合的Record会直接被跳过
- 原有的FLAG值截断逻辑完全保留,不会影响原本的功能
效果验证(针对你的示例XML):
处理后只会保留第一个Record(FLAG为ABC的那条),第二个Record(FLAG为DEFGH)会被过滤掉;同时第一个Record里的FLAG值依然会按照原逻辑截断到19个字符(示例中ABC长度不足19,所以保持原样)。
内容的提问来源于stack exchange,提问作者Hich
相关产品推荐
相关产品推荐

