0

我想使用 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 代码。

4

2 回答 2

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:Messagesandxsi: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>
于 2012-10-09T15:22:24.970 回答
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>最外层元素的孙子元素及其整个子树,并忽略其他任何内容。

于 2012-10-09T16:12:50.770 回答