重命名标记并删除属性

时间:2017-01-15 09:39:47

标签: xslt-1.0

我有一个XML文档(由WiX heat生成),我想在删除属性时删除根元素名称。源树看起来像这样

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="HELP" />
    </Fragment>
</Wix>

我想出了如何重命名节点,但这并没有删除不必要的属性xmlns

  <xsl:template match='/wix:Wix'>
    <Include>
      <xsl:copy-of select="@*|node()"/>
    </Include>
  </xsl:template>

  <!-- Even this template doesn't suppress the attribute xmlns -->
  <xsl:template match='@xmlns'/>

我的事件从select子句中删除了@*|。但这没有任何影响。

如何使用XSLT 1.0生成以下所需的输出?

<Include>
    <Fragment>
        <DirectoryRef Id="HELP" />
    </Fragment>
</Include>

1 个答案:

答案 0 :(得分:1)

  

这并不会删除不必要的属性xmlns

xmlns不是属性 - 它是名称空间,是节点名称的一部分。如果您不想在输出中使用它,则无法复制命名空间中的输入节点 - 您必须改为创建新节点,例如:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
exclude-result-prefixes="wix">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/wix:Wix">
    <Include>
        <xsl:apply-templates/>
    </Include>
</xsl:template>

<xsl:template match="*">
    <xsl:element name="{local-name()}">
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>