目前我正试图弄清楚如何使用XSL(xalan 2.7.1)将新服务器凭据插入maven settings.xml。我的问题是,输出XML在他的标签中总是有一个空的xmlns=""
元素,而Maven并不喜欢!
这是基础XML:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
...
<!-- Server Credentials -->
<servers>
</servers>
</settings>
我的XSL:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:mvn="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xslt="http://xml.apache.org/xslt"
exclude-result-prefixes="mvn xsl xslt">
<xsl:output method="xml" encoding="UTF-8" omit-xml-declaration="yes" indent="yes" xslt:indent-amount="4" />
<xsl:param name="server.id" />
<xsl:param name="server.username" />
<xsl:param name="server.password" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="mvn:servers">
<xsl:copy>
<xsl:apply-templates />
<server>
<id>
<xsl:value-of select="$server.id" />
</id>
<username>
<xsl:value-of select="$server.username" />
</username>
<password>
<xsl:value-of select="$server.password" />
</password>
</server>
</xsl:copy>
</xsl:template>
转型结束时,它看起来像这样:
<!-- Server Credentials -->
<servers>
<server xmlns="">
<id>nexus-nbg</id>
<username>testuser</username>
<password>{PMjrq7GDvwgH4xBziBIjb71GZSlgovs6D85zXogvP9I=}</password>
</server>
</servers>
所以它插入一个空的xmlns
- Maven不喜欢的标签并打印一些警告。第一个server
- 标签也有错误的缩进?!所以我已经映射了名称空间,以便匹配器工作,我还包括exlude-result-prefixes
我还需要做什么?!
如果有人在这里有想法会很高兴!
祝福,
丹尼尔
答案 0 :(得分:4)
当你这样做时:
<xsl:template match="mvn:servers">
<xsl:copy>
您正在复制源文档中的servers
元素 - 包括其原始命名空间。但是添加的子server
元素在no-namespace中 - 并且XSLT处理器添加了一个空的xmlns=""
命名空间声明来标记它。
如果您希望添加的子元素与其servers
父元素位于同一名称空间中,则必须将其明确放在那里:
<xsl:template match="mvn:servers">
<xsl:copy>
<xsl:apply-templates />
<server xmlns="http://maven.apache.org/SETTINGS/1.0.0">
<id>
<xsl:value-of select="$server.id" />
</id>
<username>
<xsl:value-of select="$server.username" />
</username>
<password>
<xsl:value-of select="$server.password" />
</password>
</server>
</xsl:copy>
</xsl:template>
您可以通过将默认的xmlns="http://maven.apache.org/SETTINGS/1.0.0"
命名空间声明移动到stylesheet
元素来实现相同的功能。然后样式表中的任何文字结果元素将自动放置在默认命名空间中,除非您通过另一个命名空间声明覆盖它。