合并具有相同名称XSLT的2个元素

时间:2013-07-15 10:15:55

标签: xml xslt merge

我找不到解决问题的方法。当它们在文档中的特定位置时,我需要将具有相同名称的两个元素合并为一个:标签hi当它们之间保持lb break ='no'时。我怎样才能做到这一点? xml代码是:

<p>
 <lb n="28"/> Lorem ipsum dolor sit
 <lb n="29"/> amet, consectetur, <hi rend="u">adi</hi>
 <lb n="30" break="no"/><hi rend="u">pisci</hi> elit...
</p>

我把它转换成一个没有换行的浮动文本,因为有一个连字符,我需要将这两个元素合并为一个。现在我总是在他们之间留下空白。

<p>Lorem ipsum dolor sit amet, consectetur <span class="u">adipisici</span> elit...</p>

非常感谢!

1 个答案:

答案 0 :(得分:1)

假设像Saxon 9或XmlPrime这样的XSLT 2.0处理器可以使用

<xsl:stylesheet
  version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="xs">

<xsl:template match="p">
  <xsl:copy>
    <xsl:for-each-group select="node() except text()[not(normalize-space())]"
      group-adjacent="self::hi or self::lb[@break = 'no']">
      <xsl:choose>
        <xsl:when test="current-grouping-key()">
          <span class="{current-group()[self::hi][1]/@rend}">
            <xsl:apply-templates select="current-group()/node()"/>
          </span>
        </xsl:when>
        <xsl:otherwise>
          <xsl:apply-templates select="current-group()"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each-group>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

转换

<p>
 <lb n="28"/> Lorem ipsum dolor sit
 <lb n="29"/> amet, consectetur, <hi rend="u">adi</hi>
 <lb n="30" break="no"/><hi rend="u">pisci</hi> elit...
</p>

<p> Lorem ipsum dolor sit
  amet, consectetur, <span class="u">adipisci</span> elit...
</p>