拆分 xml 标签并将其分组到 xslt 中的另一个标签
split xml tag and group it into another tag in xslt
输入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 吗?无论标签 givenname/surname 出现在输入 xml 中 ref 标签的第一个位置,然后姓氏应该在输出 xml.
中排在第一位
也许不是最好的解决方案,但它有效:
<?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
输入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 吗?无论标签 givenname/surname 出现在输入 xml 中 ref 标签的第一个位置,然后姓氏应该在输出 xml.
中排在第一位也许不是最好的解决方案,但它有效:
<?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