如何修改创建的输出 DOM 元素?
How to modify created output DOM element?
我有 xml
:
<Root>
<A>
<B>X</B>
<C>Y</C>
<D>Z</D>
</A>
</Root>
使用 xslt
变换,我需要得到这个:
<Root>
<Wrap type="B">
<A>
<B>X</B>
</A>
</Wrap>
<Wrap type="C">
<A>
<B>Y</B>
</A>
</Wrap>
<Wrap type="D">
<A>
<B>Z</B>
</A>
</Wrap>
</Root>
我应该使用哪种 xsl::select
?以及如何修改 xsl
.
中刚刚创建的元素
编辑:更正拼写错误,问题已更新。
我将另一个元素添加到列表中,现在它是 A 的列表,应该被分类。
<Root>
<A>
<B>X</B>
<C>Y</C>
<D>Z</D>
</A>
<A>
<B>X1</B>
<C>Y1</C>
<D>Z1</D>
</A>
</Root>
现在我想得到
<Root>
<Wrap type="B">
<A>
<B>X</B>
<B>X1</B>
</A>
</Wrap>
<Wrap type="C">
<A>
<B>Y</B>
<B>Y1</B>
</A>
</Wrap>
<Wrap type="D">
<A>
<B>Z</B>
<B>Z1</B>
</A>
</Wrap>
</Root>
使用这个
<xsl:template match="Root">
<xsl:copy>
<xsl:for-each select="A[1]/*">
<xsl:variable name="en" select="local-name(current())"/>
<Wrap type="{local-name(current())}">
<A>
<xsl:for-each select="//A/*[name() eq $en]">
<B>
<xsl:value-of select="."/>
</B>
</xsl:for-each>
</A>
</Wrap>
</xsl:for-each>
</xsl:copy>
</xsl:template>
更新分组:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="Root">
<xsl:copy>
<xsl:for-each-group select="A/*" group-by="name()">
<xsl:element name="Wrap">
<xsl:attribute name="name"><xsl:value-of select="current-grouping-key()" /></xsl:attribute>
<A>
<xsl:for-each select="current-group()">
<B>
<xsl:value-of select="." />
</B>
</xsl:for-each>
</A>
</xsl:element>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我有 xml
:
<Root>
<A>
<B>X</B>
<C>Y</C>
<D>Z</D>
</A>
</Root>
使用 xslt
变换,我需要得到这个:
<Root>
<Wrap type="B">
<A>
<B>X</B>
</A>
</Wrap>
<Wrap type="C">
<A>
<B>Y</B>
</A>
</Wrap>
<Wrap type="D">
<A>
<B>Z</B>
</A>
</Wrap>
</Root>
我应该使用哪种 xsl::select
?以及如何修改 xsl
.
编辑:更正拼写错误,问题已更新。 我将另一个元素添加到列表中,现在它是 A 的列表,应该被分类。
<Root>
<A>
<B>X</B>
<C>Y</C>
<D>Z</D>
</A>
<A>
<B>X1</B>
<C>Y1</C>
<D>Z1</D>
</A>
</Root>
现在我想得到
<Root>
<Wrap type="B">
<A>
<B>X</B>
<B>X1</B>
</A>
</Wrap>
<Wrap type="C">
<A>
<B>Y</B>
<B>Y1</B>
</A>
</Wrap>
<Wrap type="D">
<A>
<B>Z</B>
<B>Z1</B>
</A>
</Wrap>
</Root>
使用这个
<xsl:template match="Root">
<xsl:copy>
<xsl:for-each select="A[1]/*">
<xsl:variable name="en" select="local-name(current())"/>
<Wrap type="{local-name(current())}">
<A>
<xsl:for-each select="//A/*[name() eq $en]">
<B>
<xsl:value-of select="."/>
</B>
</xsl:for-each>
</A>
</Wrap>
</xsl:for-each>
</xsl:copy>
</xsl:template>
更新分组:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="Root">
<xsl:copy>
<xsl:for-each-group select="A/*" group-by="name()">
<xsl:element name="Wrap">
<xsl:attribute name="name"><xsl:value-of select="current-grouping-key()" /></xsl:attribute>
<A>
<xsl:for-each select="current-group()">
<B>
<xsl:value-of select="." />
</B>
</xsl:for-each>
</A>
</xsl:element>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>