使用XSLT从现有XML生成新XML——Maven运行时修改pom.xml需求
Maven中使用XSLT提取pom.xml转换后的完整节点
我明白你正在通过Maven集成XSLT来处理pom.xml,核心目标是生成包含完整XML节点的交付资源。结合你提供的信息,我整理了针对性的解决方案:
已知输入XML片段
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <group...
核心解决思路
要实现仅输出转换后的完整XML节点,需要重点关注两个关键点:
- 正确处理Maven POM的命名空间(这是很多开发者踩坑的核心点)
- 精准匹配并提取/转换目标节点,确保输出是结构完整的XML片段
示例XSLT模板(以提取项目核心信息节点为例)
假设你需要生成包含项目基本信息的完整节点,XSLT可以这么写:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pom="http://maven.apache.org/POM/4.0.0" exclude-result-prefixes="pom"> <!-- 匹配根节点,生成目标完整节点 --> <xsl:template match="/pom:project"> <project-deliverable> <xsl:copy-of select="pom:groupId"/> <xsl:copy-of select="pom:artifactId"/> <xsl:copy-of select="pom:version"/> <xsl:copy-of select="pom:name"/> </project-deliverable> </xsl:template> <!-- 忽略所有不需要的节点和文本 --> <xsl:template match="text()|@*"/> </xsl:stylesheet>
Maven中配置XSLT转换插件
要在Maven构建过程中自动执行这个转换,你可以在pom.xml中配置xml-maven-plugin,确保转换后的文件作为交付资源输出:
<build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>xml-maven-plugin</artifactId> <version>1.0.2</version> <executions> <execution> <phase>generate-resources</phase> <goals> <goal>transform</goal> </goals> <configuration> <transformationSets> <transformationSet> <dir>${project.basedir}</dir> <includes> <include>pom.xml</include> </includes> <stylesheet>${project.basedir}/src/main/resources/pom-transform.xsl</stylesheet> <outputDir>${project.build.directory}/generated-resources</outputDir> <fileMappers> <fileMapper implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper"> <targetExtension>.xml</targetExtension> </fileMapper> </fileMappers> </transformationSet> </transformationSets> </configuration> </execution> </executions> </plugin> </plugins> </build>
关键注意事项
- 必须在XSLT中声明POM的命名空间(
http://maven.apache.org/POM/4.0.0),否则无法正确匹配节点 - 如果你的预期输出是其他类型的完整节点,只需调整XSLT中
xsl:copy-of或xsl:apply-templates的匹配逻辑即可 - 转换后的文件默认会输出到
target/generated-resources目录,该目录下的文件会被Maven自动打包为交付资源
如果你能补充完整的XSLT代码和预期输出的具体节点示例,我可以帮你进一步优化转换逻辑!
内容的提问来源于stack exchange,提问作者Thilak
相关产品推荐
相关产品推荐

