0

嗨,我有一个看起来像这样的 xml 文档:

<a> <!-- Several nodes "a" with the same structure for children -->
    <b>12</b>
    <c>12</c>
    <d>12</d>
    <e>12</e>
    <f>12</f>
    <g>12</g>
</a>

我正在尝试使用 xslt 2.0 获取以下文档

<a>
    <b>12</b>
    <c>12</c>
    <wrap>
        <d>12</d>        
        <e>12</e>
        <f>12</f>
        <g>12</g>
    </wrap>
</a>

我开始了我的xsl文件

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

并针对几种情况进行了更改,例如替换字符串部分,过滤某些节点等。但是我被“选择四个连续节点”所困扰,关于如何实现包装的任何线索?

4

2 回答 2

2

如果你所有的a元素都是真正完全相同的结构,那么最简单的就是蛮力

<xsl:template match="a">
  <xsl:copy>
    <xsl:apply-templates select="b | c" />
    <wrap>
      <xsl:apply-templates select="d | e | f | g" />
    </wrap>
  </xsl:copy>
</xsl:template>

或者如果你想更聪明一点

    <wrap>
      <xsl:apply-templates select="* except (b | c)" />
    </wrap>

如果您想始终“包装” 的最后四个子元素a,那么如何

<xsl:template match="a">
  <xsl:variable name="lastFour" select="*[position() &gt; (last() - 4)]" />
  <xsl:copy>
    <xsl:apply-templates select="* except $lastFour" />
    <wrap>
      <xsl:apply-templates select="$lastFour" />
    </wrap>
  </xsl:copy>
</xsl:template>
于 2013-05-24T10:03:31.873 回答
1

使用 XSLT 2.0,您还可以使用for-each-group group-adjacent

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output indent="yes"/>

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

    <xsl:template match="a">
      <xsl:copy>
        <xsl:for-each-group select="*" group-adjacent="boolean(self::d | self::e | self::f | self::g)">
          <xsl:choose>
            <xsl:when test="current-grouping-key()">
              <wrap>
                <xsl:apply-templates select="current-group()"/>
              </wrap>
            </xsl:when>
            <xsl:otherwise>
              <xsl:apply-templates select="current-group()"/>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:for-each-group>
      </xsl:copy>
    </xsl:template>

    </xsl:stylesheet>
于 2013-05-24T10:15:46.467 回答