通过XSLT(xalan)插入XML会在输出XML中生成xmlns条目

时间:2016-01-22 14:39:15

标签: xml maven xslt xalan

目前我正试图弄清楚如何使用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我还需要做什么?!

如果有人在这里有想法会很高兴!

祝福,

丹尼尔

1 个答案:

答案 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元素来实现相同的功能。然后样式表中的任何文字结果元素将自动放置在默认命名空间中,除非您通过另一个命名空间声明覆盖它。