使用xslt删除命名空间n标记

时间:2012-10-09 13:33:50

标签: xslt

我想使用xslt

删除两个根标签和一个命名空间
<?xml version="1.0" encoding="UTF-8"?>
<sxi:Messages xmlns:sxi="http://sap.com/xi/XI/SplitAndMerge">
<sxi:Message1>
<ZDetails>
.
.
</ZDetails>
</sxi:Message1>
</sxi:Messages>

我希望它是

<?xml version="1.0" encoding="UTF-8"?>
<ZDetails>
..
.
</ZDetails>

标签之间的数据n不应该被更改。我尝试通过搜索加入一些xslt代码但是它们正在删除ZDetails之间的一些属性。所以张贴一个新的。任何人都可以帮助我了解各自的xslt代码。

2 个答案:

答案 0 :(得分:1)

这应该这样做:

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:sxi="http://sap.com/xi/XI/SplitAndMerge">

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="sxi:Messages">
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="sxi:Message1">
    <xsl:apply-templates/>
  </xsl:template>

</xsl:stylesheet>

第一个模板会复制所有内容,其他两个模板会跳过sxi:Messagesxsi:Message1元素 - 仍在复制其内容。

如果要删除http://sap.com/xi/XI/SplitAndMerge命名空间中的所有元素:

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:sxi="http://sap.com/xi/XI/SplitAndMerge">

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="sxi:*">
    <xsl:apply-templates/>
  </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:1)

这是一种简单的方法,保证不会在<ZDetails>元素下更改任何内容:

<xsl:stylesheet version="1.0" 
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/">
    <xsl:copy-of select="/*/*/ZDetails" />
  </xsl:template>

</xsl:stylesheet>

模板只复制最外层元素的孙<ZDetails>元素及其整个子树,并忽略其他任何内容。