首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT转换(xml到xml)

XSLT转换(xml到xml)
EN

Stack Overflow用户
提问于 2017-02-14 12:03:45
回答 1查看 128关注 0票数 0

我有这样一个XML:

代码语言:javascript
复制
<object>
    <string name "order">1<string>
    <string name "item">1<string>
</object>
<object>
    <string name "order">1<string>
    <string name "item">2<string>
</object>
<object>
    <string name "order">2<string>
    <string name "item">1<string>
</object>

我想将xml转换成这样的结构:

代码语言:javascript
复制
<object order=1>
    <string name "item">1<string>
    <string name "item">2<string>
</object>
<object order=2>
    <string name "item">1<string>
</object>

我想用XSLT动态地转换输入XML,但是我很难做到。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-15 18:17:54

要做的第一件事是将源XML带到适当的形式。

  1. XML只包含一个根标记(让我们称之为),这个标记可以包含多个源标记(例如,对象)。
  2. 每个标记(正如您在字符串标记中所写的那样)可以包含一个带有值的属性(在您的情况下名称和顺序),但是它们之间必须是"=“符号。
  3. 在对象标记的情况下,您记得在结束标记中放置一个"/“,但是在每个结束字符串标记中都忘记了它。

因此,正确的输入XML (在必要的更正之后)是:

代码语言:javascript
复制
<main>
  <object>
    <string name="order">1</string>
    <string name="item">1</string>
  </object>
  <object>
    <string name="order">1</string>
    <string name="item">2</string>
  </object>
  <object>
    <string name="order">2</string>
    <string name="item">1</string>
  </object>
</main>

现在让我们来谈一下主要的事情。在描述中,我将行号--对最终解决方案的引用。

我们从xsl:output indent="yes“(第2行)开始,否则所有内容都在一行中(难以阅读)。

XML代码包含一个匹配的主标记(第4行)。

它所做的第一件事是复制(打开和关闭主标记-第5行)。

然后,第6行包含分组循环(对于-每个组)。分组的对象是对象元素(请参阅select子句),分组键是字符串子标记(相对于当前对象)的内容,属性名等于"order“(请参见group-by子句)。

因此,第一组包含对象标记No 1和2(它们都具有字符串name="order“标记,其内容为"1”,而第二组包含对象标记No 3。

然后(对于每组源对象标记),我们创建一个输出对象元素(第7行)。

该元素必须具有一个名为order的属性,该属性的值为当前分组键(第8行)。

当前元素(output对象)包含来自当前组中每个元素的数据,因此我们必须为每个语句编写当前组的内容(参见select子句,第9行),遍历所有源对象标记。

在这个循环中,对于每个输入对象,我们创建一个string元素(第10行)。

这个元素有一个名为" name“的属性(请参见name子句),其值应该是"item”(请参阅select子句)-第11行。

最后要做的事情是创建输出标记的内容-子字符串标记的值(相对于当前对象),其名称属性为item value - row 12。

XSL中的所有其他行都是关闭标记。

下面是一个完整的XSL解决方案。

代码语言:javascript
复制
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output indent="yes"/>

  <xsl:template match="main">
    <xsl:copy>
      <xsl:for-each-group select="object" group-by="string[@name='order']">
        <xsl:element name="object">
          <xsl:attribute name="order" select="current-grouping-key()"/>
          <xsl:for-each select="current-group()">
            <xsl:element name="string">
              <xsl:attribute name="name" select="'item'"/>
              <xsl:value-of select="string[@name='item']"/>
            </xsl:element>
          </xsl:for-each>
        </xsl:element>
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>

</xsl:transform>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42225707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档