XSLT 2.0在指定子项周围拆分元素

时间:2018-09-25 17:20:51

标签: xml xslt xpath

我需要确定遇到指定子元素时将其拆分的方法。输入示例:

<root>
...
<span>Here's that <link>link</link> for you.</span>
...
</root>

所需的输出:

<root>
...
<span>Here's that </span><link>link</link><span> for you.</span>
...
</root>

我知道我可以使用标记化在给定的文本周围拆分字符串,但是我需要在给定的元素周围拆分元素,但我不确定解决此问题的最佳方法。

请注意,我正在使用高度受限的DTD,所以我们可能会看到的最复杂的嵌套情况如下所示:

示例输入:

<root>
...
<span>Here's that <link>link</link> and this <link>link</link>and this <link>link</link>for you.</span>
...
</root>

所需的输出:

<root>
...
<span>Here's that </span><link>link</link><span> and this </span><link>link</link><span> and this </span><link>link</link><span> for you.</span>
...
</root>

1 个答案:

答案 0 :(得分:2)

在XSLT 2或3中,这似乎是一个分组问题,解决了(假设您只想将该解决方案应用于至少有一个span子元素的link元素):

  <xsl:template match="span[link]">
      <xsl:for-each-group select="node()" group-adjacent="boolean(self::link)">
          <xsl:choose>
              <xsl:when test="current-grouping-key()">
                  <xsl:apply-templates select="current-group()"/>
              </xsl:when>
              <xsl:otherwise>
                  <span>
                      <xsl:apply-templates select="current-group()"/>
                  </span>
              </xsl:otherwise>
          </xsl:choose>
      </xsl:for-each-group>
  </xsl:template>

当然还要加上身份转换模板来复制/处理其余的内容。 https://xsltfiddle.liberty-development.net/6qVRKwK/1,XSLT 2 http://xsltransform.hikmatu.com/gWmuiHN的XSLT 3在线示例。