如何使用XMLNS属性转换元素

时间:2015-04-07 16:16:39

标签: xml transformation xml-namespaces xdt-transform

我正在尝试转换包含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属性转换工作,那似乎无效。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

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

<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命名空间进行一些研究。

答案 1 :(得分:0)

要删除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个元素,则可能必须以不同方式处理。