如何将一堆节点转换为表

时间:2016-05-31 08:22:52

标签: xml xslt

我有这样的事情:

<root>
   <elementA></elementA>
   <elementB></elementB>

   <elementC>Some Data 1</elementC>
   <elementC>Some Data 2</elementC>
   <elementC>Some Data 3</elementC>

   <elementD></elementD>

   <elementC>Other Data 1</elementC>
   <elementC>Other Data 2</elementC>
   <elementC>Other Data 3</elementC>
</root>

我需要这样的东西:

<root>
   <elementA></elementA>
   <elementB></elementB>

   <wraper_for_C>
      <elementC>Some Data 1</elementC>
      <elementC>Some Data 2</elementC>
      <elementC>Some Data 3</elementC>
   <wrapper_for_C>

   <elementD></elementD>

   <wraper_for_C>
      <elementC>Other Data 1</elementC>
      <elementC>Other Data 2</elementC>
      <elementC>Other Data 3</elementC>
   <wrapper_for_C>
</root>

有人知道如何围绕一个具有相同名称的元素块获取包装吗?

2 个答案:

答案 0 :(得分:0)

xslt 1.0

void RepositoryItemRemoved(int i)
{
    beginRemoveRows(QModelIndex(), i, i);
    removeModelItem(i);
    endRemoveRows();
}

P.S。我错了,我认为这都是关于C元素的:)

答案 1 :(得分:0)

如果您可以使用XSLT 2.0,则可以使用group-adjacent属性xsl:for-each-group来对相邻元素进行分组。

试试这个XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:template match="root">
    <xsl:copy>
      <xsl:for-each-group select="*" group-adjacent="name()">
        <xsl:choose>
          <xsl:when test="count(current-group()) > 1">
            <xsl:element name="Wrapper_{name()}">
              <xsl:apply-templates select="current-group()" />
            </xsl:element>
          </xsl:when>
          <xsl:otherwise>
              <xsl:apply-templates select="current-group()" />
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>

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

请注意使用Attribute Value Templates根据分组的元素名称动态创建包装元素名称。