You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用XSLT替换字符串部分内容?(Java包名更新场景)

用XSLT替换XML属性中的Java包名(保留类名)

需求是将XML中clazz元素的value属性里的包名前缀com.example替换为com.example.main,同时保留属性值中的类名部分(比如MyClass)。原XSLT因匹配条件错误(仅匹配完全等于com.example的属性值),且直接替换会丢失类名,导致无法实现需求。

原XML内容

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MyConfiguration>
    <modules>
        <root>
            <mappings>
                <pojoMapping name="MyClass">
                    <id>104</id>
                    <clazz value="com.example.MyClass"/>
                </pojoMapping>
            </mappings>
        </root>
    </modules>
</MyConfiguration>

原XSLT(无法满足需求)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsl:stylesheet version="2.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>

    <xsl:template name="update-package-name" match="mappings/pojoMapping/clazz/@value[.='com.example']">
        <xsl:attribute name="value">com.example.main</xsl:attribute>
    </xsl:template>

</xsl:stylesheet>

正确的XSLT解决方案

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsl:stylesheet version="2.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>

    <!-- 匹配所有包含com.example.前缀的clazz/@value属性 -->
    <xsl:template match="mappings/pojoMapping/clazz/@value[starts-with(., 'com.example.')]">
        <!-- 使用replace函数替换前缀,保留后续类名 -->
        <xsl:attribute name="value">
            <xsl:value-of select="replace(., '^com\.example\.', 'com.example.main.')"/>
        </xsl:attribute>
    </xsl:template>

</xsl:stylesheet>

方案说明

  1. 匹配条件调整:用starts-with(., 'com.example.')匹配所有以com.example.开头的属性值,覆盖带类名的目标属性,解决原XSLT匹配范围过窄的问题。
  2. 字符串替换:利用XSLT 2.0的replace()函数,通过正则表达式^com\.example\.精准匹配开头的包名前缀,替换为com.example.main.,确保保留属性值里的类名部分,最终得到com.example.main.MyClass。
  3. 身份模板确保XML中其他未涉及的内容完全保留,只修改目标属性。

内容的提问来源于stack exchange,提问作者Alan Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:24:29