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>
我是 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>