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

XML insert via XSLT (xalan) produces xmlns entries in output XML

目前我正在尝试弄清楚如何使用 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-Tag 也有错误的缩进?!所以我已经映射了名称空间,以便匹配器工作,我还包括 exlude-result-prefixes 我还需要做什么?!

如果这里有人有想法,我们将很高兴!

祝福,

丹尼尔

当你这样做时:

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