我正在尝试转换包含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
属性转换工作,那似乎无效。
我做错了什么?
答案 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
个元素,则可能必须以不同方式处理。