如何使用 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>
但这似乎不起作用,但是如果我删除 xmlns
和 xmlns: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 名称空间进行一些研究。
我正在尝试转换另一个包含 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>
但这似乎不起作用,但是如果我删除 xmlns
和 xmlns: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 名称空间进行一些研究。