Вставка XML через XSLT (xalan) создает записи xmlns в выходном XML

На данный момент я пытаюсь выяснить, как вставить новые учетные данные сервера в maven settings.xml с помощью XSL (xalan 2.7.1). Моя проблема в том, что выходной 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>

At the end of the transformation, it Looks like this:

    <!-- Server Credentials -->
    <servers>
    <server xmlns="">
            <id>nexus-nbg</id>
            <username>testuser</username>
            <password>{PMjrq7GDvwgH4xBziBIjb71GZSlgovs6D85zXogvP9I=}</password>
        </server>
    </servers>

Поэтому он вставляет пустой xmlns-тег, который не нравится Maven, и печатает некоторые ПРЕДУПРЕЖДЕНИЯ. Также у первого server-тега тоже неправильный отступ?! Итак, я уже сопоставляю пространства имен, чтобы сопоставитель работал, и я также включил exlude-result-prefixes Что еще мне нужно сделать?!

Буду рад, если у кого-нибудь здесь есть идея!

С наилучшими пожеланиями,

Даниэль


person H. Daniel    schedule 22.01.2016    source источник


Ответы (1)


Когда вы делаете:

<xsl:template match="mvn:servers">
    <xsl:copy>

вы копируете элемент servers из исходного документа, включая его исходное пространство имен. Но добавленный дочерний элемент server находится в пространстве без имен, и процессор 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. Тогда любой литеральный элемент результата в вашей таблице стилей будет автоматически помещен в пространство имен по умолчанию, если только вы не переопределите это другим объявлением пространства имен.

person michael.hor257k    schedule 22.01.2016