我有这个 xml 输入,需要将其转换为另一个 xml(svg 文件),将多个节点属性合并为一个属性。
xsl 有什么解决方案吗?
<b>
<h a="1" b="2" c="3"/>
<h a="4" b="5" c="6"/>
<h a="7" b="8" c="9"/>
</b>
预期输出:
<g>
<p d="1,2,3 4,5,6 7,8,9"/>
</g>
所以尝试与一个xsl合并(实际上有几个......),但我找不到诀窍......
这是我最后一次尝试,只输出最后一个元素 (7,8,9)。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/b">
<g>
<p>
<xsl:apply-templates select="h"/>
</p>
</g>
</xsl:template>
<xsl:template match="h">
<xsl:attribute name="p">
<xsl:value-of select="concat(@a,' ',@b,' ',@c)"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
此 xsl 的输出:
<?xml version="1.0" encoding="UTF-8"?><g><p p="4 5 6"/></g>
谢谢
答案 0 :(得分:0)
实现此目的的一种方法(对 XSLT-1.0 代码进行最少的修改)是:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<g>
<xsl:apply-templates select="b"/>
</g>
</xsl:template>
<xsl:template match="b">
<p>
<xsl:attribute name="d">
<xsl:for-each select="h">
<xsl:value-of select="concat(@a,',',@b,',',@c)"/>
<xsl:if test="position()!=last()"><xsl:text> </xsl:text></xsl:if>
</xsl:for-each>
</xsl:attribute>
</p>
</xsl:template>
</xsl:stylesheet>
输出符合预期:
<?xml version="1.0"?>
<g><p d="1,2,3 4,5,6 7,8,9"/></g>