XSLT-将相似节点分组在一起并删除重复的节点

时间:2019-01-07 12:19:33

标签: xml xslt transformation

我有以下XML

<?xml version="1.0"?>
<R>
  <M>
    <H>1</H>
    <B>1</B>
  </M>
  <M>
    <H>1</H>
    <B>2</B>
  </M>
  <M>
    <H>1</H>
    <B>3</B>
  </M>
  <M>
    <H>1</H>
    <B>4</B>
  </M>
</R>

在这里,如果我们假设“ M”是主节点,“ H”是标头,并且“ B”是主体,则我只想有一个带有单个“ H”的“ M”节点,而所有“ B”节点都在下面它。

基本上,我想将所有“ B”节点移动到第一个“ M”节点,并删除所有其他“ M”和“ H”标签。

任何人都可以帮助我实现这一目标。

预期输出为:

<?xml version="1.0"?>
<R>
  <M>
    <H>1</H>
    <B>1</B>
    <B>2</B>
    <B>3</B>
    <B>4</B>
  </M>
</R>

这是我当前的XSLT脚本:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0">
<xsl:output indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>
<xsl:template match="/*">
    <xsl:copy>
        <R>
            <xsl:apply-templates select="@*|M/*" />
            <xsl:apply-templates select="@*|M/B" />
        </R>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

简单的描述“基本上我想将所有的'B'节点移至第一个'M'节点并删除所有其他的'M'和'H'标签”似乎很容易解决

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

  <xsl:output indent="yes"/>

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

  <xsl:template match="R">
      <xsl:copy>
          <M>
              <xsl:apply-templates select="M[1]/H | M/B"/>
          </M>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/ej9EGbG

如果H元素具有各种值,则不确定是否需要分组。