如何使用 XMLNS 属性转换元素

How to transform element with XMLNS attribute

我正在尝试转换另一个包含 xmlns 属性的元素的子元素,但在我删除 xmlns.

之前,我的转换似乎被忽略了

假设我有:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          internalLogLevel="Trace"
          internalLogFile="NLogInternal.log"
          autoReload="true">
        <targets>
        </targets>
    </nlog>

我正在尝试通过以下方式摆脱 targets 元素:

<nlog>
    <targets xdt:Transform="Remove" />
</nlog>

但这似乎不起作用,但是如果我删除 xmlnsxmlns:xsi 属性转换会按预期工作。

我做错了什么?

要删除 targets 元素,您需要考虑其命名空间。您可以在 XSLT 中 声明 带有前缀的命名空间,您应该在模板匹配 XPath 表达式中使用它来消除 targets 树:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
    xmlns:ns1="http://www.nlog-project.org/schemas/NLog.xsd">

    <xsl:template match="@* | node()"> <!-- Copies all nodes to result tree -->
        <xsl:copy>
            <xsl:apply-templates select="@* | node()" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="ns1:targets" /> <!-- Ignores this node -->

</xsl:stylesheet>

或者完全忽略命名空间。在这种情况下,您不必声明但必须使用 XPath 表达式选择所有元素但受其本地名称限制:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[name()='targets']" />

</xsl:stylesheet>

我假设你发布的例子。如果您在其他上下文和名称空间中有其他 target 元素,您可能需要以不同的方式处理。

我不知道这是否有效,但请尝试以下操作:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd">
    <targets xdt:Transform="Remove" />
</nlog>

通过将 xmlns 属性放置在 nlog 上,您指定您的目标是 {http://www.nlog-project.org/schemas/NLog.xsd}nlog 元素,以及其中的 {http://www.nlog-project.org/schemas/NLog.xsd}targets 元素。

此外,您可能想对 XML 名称空间进行一些研究。