拆分xml标记并将其分组到xslt中的另一个标记中

时间:2016-09-03 06:31:45

标签: xml xslt-2.0

输入xml

 <root>
	<ref>
		<Auth-grp>
			<given-name>a.</given-name>
			<surname>aaaa</surname>
		</Auth-grp>
	</ref>
	<ref>
		<Auth-grp>
			<surname>bbbb</surname>
			<given-name>b.</given-name>
			<surname>cccc</surname>
			<given-name>c.</given-name>
		</Auth-grp>
	</ref>
	<ref>
		<Auth-grp>
			<surname>dddd</surname>
			<given-name>d.</given-name>
		</Auth-grp>
	</ref>
</root>

输出xml将是:

<root>
	<ref>
		<name>
			<surname>aaaa</surname>
			<given-name>a.</given-name>
		</name>
	</ref>
	<ref>
		<name>
			<surname>bbbb</surname>
			<given-name>b.</given-name>
		</name>
		<name>
			<surname>cccc</surname>
			<given-name>c.</given-name>
		</name>
	</ref>
	<ref>
		<name>
			<surname>dddd</surname>
			<given-name>d.</given-name>
		</name>
	</ref>
</root>

有人可以帮忙创建xslt 2.0吗?无论输入xml中refname标记的第一个位置是否存在givenname / surname标记,那么surname应该首先出现在输出xml中。

1 个答案:

答案 0 :(得分:0)

也许不是最好的解决方案,但它有效:

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

    <xsl:template match="Auth-grp">
        <xsl:for-each select="./*">
            <xsl:if test="position() mod 2 != 0">
                <xsl:element name="name">
                    <xsl:choose>
                        <xsl:when test="local-name() eq 'surname'">
                            <xsl:apply-templates select="." />
                            <xsl:apply-templates select="following-sibling::given-name[1]" />
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:apply-templates select="following-sibling::surname[1]" />
                            <xsl:apply-templates select="." />
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:element>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:transform>

这会遍历<Auth-grp>的所有子项,但只处理所有奇数(position() mod 2 != 0)位置(第一,第三,第五等)。

然后检查此元素是<surname>还是<given-name>。因此,它可以选择元素的显示顺序。

<name>元素内的分组需要循环本身。

您可以在线试用:http://xsltransform.net/ncntCRY