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