【问题标题】:Merge 2 elements with the same name XSLT合并 2 个同名 XSLT 元素
【发布时间】:2013-07-15 10:15:54
【问题描述】:

我找不到解决问题的有效方法。当它们在文档中的特定位置时,我需要将具有相同名称的两个元素合并为一个:标签 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>

非常感谢!

【问题讨论】:

  • 您能否将 XSLT 2.0 与 Saxon 9 之类的 XSLT 2.0 处理器一起使用?

标签: xml xslt merge


【解决方案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>

【讨论】:

  • 嗨!谢谢你的建议!但不知何故,在我的代码中,结果是这样的,现在当lb 标签停留在它们之间时,hi 标签之间没有空格。已经好了,但是又出现了新的问题。我在 XSL 中有几个命名空间,尽管在所有 p 标签中都有 exclude-result-prefixes="#all",但我有一个命名空间。我该怎么办?))
  • 使用您拥有的更复杂的 XML 样本和所需的相应转换结果来编辑您的问题。至于命名空间,我们先尝试修复您要求的转换,然后我们可以查看此类问题。如果输入在某个命名空间中有一个p,而输出需要一个没有命名空间的HTML p,则将&lt;xsl:copy&gt;&lt;xsl:for-each-group ...&gt;...&lt;/xsl:for-each-group&gt;&lt;/xsl:copy&gt; 更改为&lt;p&gt;&lt;xsl:for-each-group ...&gt;...&lt;/xsl:for-each-group&gt;&lt;/p&gt;
  • 谢谢!我已将&lt;xsl:copy&gt; 替换为&lt;p&gt;,命名空间消失了!我将尝试重写我的 xsl 以了解出了什么问题,如果我无法得到它,我将发布 xml 和 xsl 的扩展示例。非常感谢!
猜你喜欢
  • 2013-11-02
  • 2014-06-16
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 2011-05-02
  • 1970-01-01
相关资源
最近更新 更多