2015-04-07 39 views
2

我试图转换包含xmlns属性的另一个元素的子元素,但似乎我的转换被忽略,直到我删除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

'xmlns'属性定义了一个默认名称空间。你必须声明它在你的XSLT *中为这个名字空间分配一个前缀*(例如'ns1',使用'xmlns:ns1 =“...”'),并且使用前缀(例如:ns1 :targets')。您也可以尝试使用没有名称空间的XPath表达式('* [name()='targets')') – helderdarocha

+0

注意:'xdt:Transform'对于Microsoft web.config非常特定。您应该用'xdt'标签标记问题,以引入该领域的专家。 – bjimba

+0

搜索“XSLT默认命名空间”,你会发现这个问题约500个答案。 –

回答

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

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元素,则可能需要以不同方式处理。

+1

不幸的是,OP将这个问题误认为[tag:xslt]。他实际上使用了xdt转换。 –