XPath / XSLT:如何将兄弟姐妹嵌套到新的特定兄弟姐妹中?

时间:2019-11-19 15:02:27

标签: html xslt xpath

我有以下HTML片段:

<p>
    This is
    <font>start</font>
    just some <i>happy</i> text
    <font>stop</font>
    that might continue here.
</p>

并且我想使用XSLT将其转换为此:

<p>
    This is
    <hi>
       just some <i>happy</i> text
    </hi>
    that might continue here.
</p>

因此,font [text()=“ start”]和font [text()=“ stop”]之间的所有内容(节点,文本和注释)都嵌套在一个新的hi-element中。

我尝试过:

<!-- identity template here-->

<xsl:template match="font[text()='start']">
    <xsl:element name="hi">
       <!-- FOLLOWING:SIBLING UNTIL THE NEXT font[text()='stop'] -->
       <xsl:value-of select="following-sibling[????]"/>
    </xsl:element>
</xsl:template>

<xsl:template match="font[text()='stop']"><!-- do nothing--></xsl:template>

但是????是我找不到正确规则的地方。我玩了半个小时,然后我觉得问起来可能会更快。

精确到下一站很重要,因为一个p元素中可能有许多这样的构造。

谢谢

1 个答案:

答案 0 :(得分:0)

可能是这样的:

<xsl:for-each-group select="node()" group-starting-with="font[.='start']">
  <xsl:for-each-group select="current-group()" group-ending-with="font[.='end']">
    <xsl:choose>
    <xsl:when test="current-group()[self::font[.='start'] and self::font[.='end']">
      <hi>
        <xsl:copy-of select="current-group()[not(self::font)]"/>
      </hi>
    </xsl:when>
    <xsl:otherwise>
      <xsl:copy-of select="current-group()"/>
    </
  </
</

未经测试。