xml - 使用 XSLT 对 XML 中相似节点的内容进行分组

标签 xml xslt xslt-1.0

我正在使用下面的 XML

<Root>
<sample>1</sample>
<sample>2</sample>
<sample>3</sample>
<sample>4</sample>
<sample>5</sample>
<sample>6</sample>
</Root>

我想得到下面给出的输出

<sample>123456</sample>

我正在使用下面的 XSLT 来获得上面的输出。但我得到的输出是这样的。

<sample>1</sample>
<sample>23456</sample>
<sample>2</sample>
<sample>3456</sample>
<sample>3</sample>
<sample>456</sample>
<sample>4</sample>
<sample>56</sample>
<sample>5</sample>
<sample>6</sample
><sample>6</sample>
<sample></sample>

这是我试过的 XSL 代码:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="sample">
<presample>
<xsl:value-of select="."/>
<xsl:variable name="code" select="following-sibling::sample" />
<xsl:for-each select="following-sibling::sample">
<xsl:if test="not(preceding-sibling::sample)">
<xsl:value-of select="."/>
</xsl:if>
</xsl:for-each>
</presample>
</xsl:template>
</xsl:stylesheet>

请帮助我更正此 XSLT 以获得上述所需的输出。

最佳答案

怎么样:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="sample[1]">
    <sample>
      <xsl:for-each select=". | following-sibling::sample">
        <xsl:value-of select="."/>
      </xsl:for-each>
    </sample>
  </xsl:template>

  <xsl:template match="sample[position() > 1]" />
</xsl:stylesheet>

我想您的最终目标比这更复杂一些,所以如果您能详细说明,可能会有更好的通用方法。

不确定这是否是您想要的,但这里有一个可能更通用的方法:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="*[text()[normalize-space(.)] and not(name(preceding-sibling::*[1]) = name())]">
    <xsl:copy>
      <xsl:variable name="list" select=". | following-sibling::*"/>
      <xsl:for-each select="$list">
        <xsl:variable name="pos" select="position()" />
        <xsl:if test="not($list[position() &lt; $pos and name() != name(current())])">
          <xsl:value-of select="."/>
        </xsl:if>
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*[name(preceding-sibling::*[1]) = name()]" />
  <xsl:template match="text()" />
</xsl:stylesheet>

在此运行时:

<Root>
  <sample>1</sample>
  <sample>2</sample>
  <sample>3</sample>
  <sample>4</sample>
  <sample>5</sample>
  <sample>6</sample>
  <child>
    <something>4</something>
    <something>5</something>
    <something>6</something>
    <something>7</something>
    <somethingelse>a</somethingelse>
    <somethingelse>b</somethingelse>
    <somethingelse>c</somethingelse>
    <somethingelse>d</somethingelse>
    <something>8</something>
    <something>9</something>
    <something>10</something>
  </child>
</Root>

产生这个:

<sample>123456</sample>
<something>4567</something>
<somethingelse>abcd</somethingelse>
<something>8910</something>

关于xml - 使用 XSLT 对 XML 中相似节点的内容进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14272908/

相关文章:

c++ - QT 如何获取 XML 文件的最后一个节点?

java - JAXB 解码返回 null 属性命令行

java - 使用 XPathFactory 评估 Xpath 属性

xml - 元素中命名复杂类型和匿名复杂类型之间的区别

java - 如何在 XML 的 XSL 转换中包含命名空间

xml - XPath:返回具有特定子节点但没有自己文本的节点

c - 如何使用可选值在 XSLT 中模拟 C 枚举

sorting - 使用 XSLT 排序时忽略 'A' 和 'The'

xslt - 在项目中声明全局变量并在xslt中使用它

xslt-1.0 - XSLT 1.0 金额字段必须至少有 2 位小数