xslt 2.0 group-starting-with 按元素内容

xslt 2.0 group-starting-with by element contents

我是 XSLT 2.0 和 XPATH 2.0 的新手,我正在努力对联系人列表进行分组,我的目的是合并属于先前定义的人的相邻号码(注意空元素)。

这里是我的输入XML

<rows>
  <row>
    <person>John</person>
    <tel>1111</tel>
  </row>
  <row>
    <person>George</person>
    <tel>2222</tel>
  </row>
  <row>
    <person></person>
    <tel>3333</tel>
  </row>
  <row>
    <person>Carter</person>
    <tel>4444</tel>
  </row>
  <row>
    <person>Mimmo</person>
    <tel>5555</tel>
  </row>
  <row>
    <person></person>
    <tel>6666</tel>
  </row>
  <row>
    <person></person>
    <tel>7777</tel>
  </row>
  <row>
    <person></person>
    <tel>8888</tel>
  </row>
</rows>

我想要的输出

<contacts>
  <contact>
        <person>John</person>
        <numbers>
          <tel>1111</tel>
        </numbers>
  </contact>
  <contact>
        <person>George</person>
        <numbers>
          <tel>2222</tel>
          <tel>3333</tel>
        </numbers>
  </contact>
  <contact>
        <person>Carter</person>
        <numbers>
          <tel>4444</tel>
        </numbers>
  </contact>
  <contact>
        <person>Mimmo</person>
        <numbers>
          <tel>5555</tel>
          <tel>6666</tel>
          <tel>7777</tel>
          <tel>8888</tel>
        </numbers>
  </contact>
</contacts>

我尝试编写 XSLT 2.0

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="/">

    <xsl:for-each-group select="rows/row" group-starting-with="person[string-length(self) > 0]">
      <contact>
        <person>
          <xsl:value-of select="current-group()[1]/person"/>
        </person>
        <numbers>
        <xsl:for-each select="current-group()">
          <tel>
            <xsl:value-of select="tel"/>
          </tel>
        </xsl:for-each>
        </numbers>
      </contact>
    </xsl:for-each-group>
  </xsl:template>

</xsl:stylesheet>

和输出

<?xml version="1.0" encoding="UTF-8"?>
<contact>
   <person>John</person>
   <numbers>
      <tel>1111</tel>
      <tel>2222</tel>
      <tel>3333</tel>
      <tel>4444</tel>
      <tel>5555</tel>
      <tel>6666</tel>
      <tel>7777</tel>
      <tel>8888</tel>
   </numbers>
</contact>

我认为问题出在分组标准上,但我不明白为什么。 谢谢

您需要在 group-starting-with="row[normalize-space(person)]"

上匹配
  <xsl:template match="/">
   <contacts>
    <xsl:for-each-group select="rows/row" group-starting-with="row[normalize-space(person)]">
      <contact>
        <xsl:copy-of select="person"/>
        <numbers>
          <xsl:copy-of select="current-group()/tel"/>
        </numbers>
      </contact>
    </xsl:for-each-group>
   </contacts>
  </xsl:template>