XSLT将节点移动到新创建的元素

时间:2012-08-22 06:57:19

标签: xslt

很难找到使用XSLT的方法,感谢您的帮助。 RJ

输入:

<root>
    <a>a1</a>
    <b>b1</b>
    <c>c1</c>
    <a>a2</a>
    <b>b2</b>
    <c>c2</c>
    ...
</root>

输出:

<root>
    <item>
        <a>a1</a>
        <b>b1</b>
        <c>c1</c>
    </item>
    <item>
        <a>a2</a>
        <b>b2</b>
        <c>c2</c>
    </item>
    ...
</root>

2 个答案:

答案 0 :(得分:2)

如果您希望使用 a 元素作为组的第一个元素将元素“分组”为“项目”,则一种方法是使用 xsl:key 按前面第一个 a 元素

对元素进行分组
<xsl:key name="items" match="root/*" use="generate-id(preceding-sibling::a[1])" />

然后您可以简单地匹配 a 元素,并复制在键中查找的所有元素

<xsl:copy-of select="key('items', generate-id())" />

这是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>
   <xsl:key name="items" match="root/*" use="generate-id(preceding-sibling::a[1])" />

   <xsl:template match="/root">
      <root>
         <xsl:apply-templates select="@*"/>
         <xsl:apply-templates select="a" />
      </root>
   </xsl:template>

   <xsl:template match="a">
      <item>
         <xsl:copy-of select="." />
         <xsl:copy-of select="key('items', generate-id())" />
      </item>
   </xsl:template>
</xsl:stylesheet>

当应用于您的示例XML时,输出以下内容:

<root>
   <item>
      <a>a1</a>
      <b>b1</b>
      <c>c1</c>
      <a>a2</a>
   </item>
   <item>
      <a>a2</a>
      <b>b2</b>
      <c>c2</c>
   </item>
</root>

答案 1 :(得分:0)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="text()"/>

    <xsl:template match="/root">
        <root>
            <xsl:apply-templates/>
        </root>
    </xsl:template>
    <xsl:template match="a">
        <item>
            <a><xsl:value-of select="text()"/></a>
            <b><xsl:value-of select="following-sibling::b/text()"/></b>
            <c><xsl:value-of select="following-sibling::c/text()"/></c>
        </item>
    </xsl:template>
</xsl:stylesheet>