Я бы предложил переместить код новых значений в параметры, а затем, по крайней мере, в XSLT 1, я думаю, вы можете просто проверить в шаблоне значение project
с двумя xsl:if
s для двух ваших детей. ищите и добавляйте их, если они не существуют:
<xsl:template match="m:project[not(m:profiles) or not(m:distributionManagement)]">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
<xsl:if test="not(m:profiles)">
<xsl:copy-of select="$new-profiles"/>
</xsl:if>
<xsl:if test="not(m:distributionManagement)">
<xsl:copy-of select="$new-dist-man"/>
</xsl:if>
</xsl:copy>
</xsl:template>
Полный код
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:m="http://maven.apache.org/POM/4.0.0"
exclude-result-prefixes="m"
version="1.0">
<xsl:output indent="yes"/>
<xsl:param name="new-dist-man">
<distributionManagement>
<snapshotRepository>
<id>xxxx.repo</id>
<name>xxxx Nexus snapshot repository</name>
<url>http://xxx/repository/maven-snapshots/</url>
</snapshotRepository>
<repository>
<id>xxx.repo</id>
<name>xxxx Nexus repository</name>
<url>http://xxx/repository/maven-releases/</url>
</repository>
</distributionManagement>
</xsl:param>
<xsl:param name="new-profiles">
<profiles>
<profile>
<id>dev</id>
<properties>
<env>devel</env>
<snapshot>-SNAPSHOT</snapshot>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<env>prod</env>
<snapshot></snapshot>
</properties>
</profile>
</profiles>
</xsl:param>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="m:project[not(m:profiles) or not(m:distributionManagement)]">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
<xsl:if test="not(m:profiles)">
<xsl:copy-of select="$new-profiles"/>
</xsl:if>
<xsl:if test="not(m:distributionManagement)">
<xsl:copy-of select="$new-dist-man"/>
</xsl:if>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
С XSLT 3 (возможно в Java с Saxon 9.8 или 9.9 HE от Maven или Sourceforge) он становится немного более компактным, поскольку параметры являются нормальными последовательностями, и мы можем просто проверить в предикате, не имеет ли контекстный узел соответствующего дочернего элемента:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://maven.apache.org/POM/4.0.0"
xpath-default-namespace="http://maven.apache.org/POM/4.0.0"
exclude-result-prefixes="#all"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output indent="yes"/>
<xsl:param name="new-dist-man">
<distributionManagement>
<snapshotRepository>
<id>xxxx.repo</id>
<name>xxxx Nexus snapshot repository</name>
<url>http://xxx/repository/maven-snapshots/</url>
</snapshotRepository>
<repository>
<id>xxx.repo</id>
<name>xxxx Nexus repository</name>
<url>http://xxx/repository/maven-releases/</url>
</repository>
</distributionManagement>
</xsl:param>
<xsl:param name="new-profiles">
<profiles>
<profile>
<id>dev</id>
<properties>
<env>devel</env>
<snapshot>-SNAPSHOT</snapshot>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<env>prod</env>
<snapshot></snapshot>
</properties>
</profile>
</profiles>
</xsl:param>
<xsl:template match="project[not(profiles) or not(distributionManagement)]">
<xsl:copy>
<xsl:apply-templates select="@*, node(), $new-profiles[not(current()/profiles)], $new-dist-man[not(current()/distributionManagement)]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty -development.net / bFN1y8M /