XSLT 将节点属性合并为一个属性

时间:2021-03-20 21:57:12

标签: xml svg xslt

我有这个 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>

谢谢

1 个答案:

答案 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>
相关问题