【问题标题】:XSLT - Group similar nodes together and remove duplicate nodesXSLT - 将相似节点组合在一起并删除重复节点
【发布时间】:2019-01-07 12:19:33
【问题描述】:

我有以下 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'是主体,我希望只有一个'M'节点和单个'H'和所有'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 版,但是您可以使用 XSLT 2.0 吗?对于这样的分组问题,使用 XSLT 2.0 及更高版本要简单得多。谢谢。

标签: xml xslt transformation


【解决方案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 元素有不同的值,不确定是否需要任何分组。

【讨论】:

  • 谢谢@Martin,它看起来很有希望,我会尝试并告诉你。
  • 感谢@Martin,您的解决方案对我有用,但我还有另一个属性问题。我有一个命名空间属性,我只需要路由节点,但我得到了所有子节点的空属性。我在这里演示了这个问题xsltfiddle.liberty-development.net/ej9EGbG/12
  • 如果您希望将输入中的元素转换为不同的命名空间,那么您需要设置一个模板来执行此操作,例如考虑到样式表根元素上的默认命名空间,&lt;xsl:template match="H | B"&gt;&lt;xsl:element name="{local-name()}"&gt;... 就足够了:xsltfiddle.liberty-development.net/ej9EGbG/13
  • 非常感谢@Martin。接受你的回答。
  • 当我这样做时,我注意到结果 XML 中缺少属性。这里我有一个属性 ccy="GBP",结果 XML 中缺少该属性。 xsltfiddle.liberty-development.net/ej9EGbG/28
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 2011-07-01
  • 2017-06-15
相关资源
最近更新 更多