Xml XSLT将字段放在一起
我试图在一个特定字段上进行筛选,并在另一个字段上进行筛选: 输入:Xml XSLT将字段放在一起,xml,xslt,xpath,concat,Xml,Xslt,Xpath,Concat,我试图在一个特定字段上进行筛选,并在另一个字段上进行筛选: 输入: <?xml version="1.0" encoding="UTF-8"?> <payloads> <payload> <firstname>michael</firstname> <secondname>brown</secondname> <number>1</numb
<?xml version="1.0" encoding="UTF-8"?>
<payloads>
<payload>
<firstname>michael</firstname>
<secondname>brown</secondname>
<number>1</number>
</payload>
<payload>
<firstname>michael</firstname>
<secondname>brown</secondname>
<number>2</number>
</payload>
<payload>
<firstname>michael</firstname>
<secondname>brown</secondname>
<number>3</number>
</payload>
</payloads>
迈克尔
棕色的
1.
迈克尔
棕色的
2.
迈克尔
棕色的
3.
输出:
<?xml version="1.0" encoding="UTF-8"?>
<payloads>
<payload>
<firstname>michael</firstname>
<secondname>brown</secondname>
<number>1,2,3</number>
</payload>
</payloads>
迈克尔
棕色的
1,2,3
我知道我需要遍历每个有效负载标签,但目前我无法正确地获得它的输出。目前,我有以下几点:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="payloads">
<xsl:copy>
<xsl:for-each select="payload">
<payload>
<xsl:value-of select="firstname"/>
<xsl:value-of select="secondname"/>
<xsl:value-of select="number"/>
</payload>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
使用此模板:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="k" match="payload" use="concat(firstname, '|', secondname)"/>
<xsl:template match="payload[generate-id() =
generate-id(key('k', concat(firstname, '|', secondname)))]">
<xsl:copy>
<xsl:copy-of select="firstname"/>
<xsl:copy-of select="secondname"/>
<number>
<xsl:for-each select="key('k', concat(firstname, '|', secondname))">
<xsl:value-of select="number"/>
<xsl:if test="position() != last()">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:for-each>
</number>
</xsl:copy>
</xsl:template>
<xsl:template match="payload"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
,
当应用于提供的输入XML时,它输出正确的结果:
<payloads>
<payload>
<firstname>michael</firstname>
<secondname>brown</secondname>
<number>1,2,3</number>
</payload>
</payloads>
迈克尔
棕色的
1,2,3
所以实际上,你想按名字
,第二名字
进行分组,然后“聚合”(concat)他们所有的数字?这很好。非常感谢。如果我想使用相同的,但只是匹配上说的名字,我可以使用这个吗<代码>??和
&这
??@liveek,欢迎光临。是的,你可以。那太好了。我想知道我是否想在XSLT方面获得更多的经验,因为我是新手。你有什么建议可以阅读,或者培训可以让自己变得更充分吗?@liveek,W3C的XSLT/XPath规范(例如:),一些高评级的XSLT书籍,还有练习,练习,练习。。。