将匹配元素属性合并为单个元素

时间:2012-07-06 17:27:50

标签: xslt merge

我有以下标记。

<para><span class="bidi"/><span class="ind"/>1</para>

我正在努力实现这一目标......

<para><span style="direction:rtl; text-indent:10pt;">1</span></para>

但是,我得到了这个......

<para><span style="direction:rtl">1</span><span style="text-indent:10pt">1</span></para>

这是我的XSLT。

  <xsl:template match="span" name="spans">
        <span>
            <xsl:attribute name="style">
        <xsl:choose>                
            <xsl:when test="@class eq 'bidi'">
                <xsl:text>direction:rtl</xsl:text>                
            </xsl:when>
            <xsl:when test="@class eq 'ind'">
                <xsl:text>text-indent:10pt;</xsl:text>                
            </xsl:when>
            <xsl:otherwise/>
        </xsl:choose>
            </xsl:attribute>
            <xsl:apply-templates/>
        </span>
    </xsl:template>

如何将多个跨度与所有类属性值合并为1?

1 个答案:

答案 0 :(得分:1)

此转化:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="para[span]">
     <para>
       <span>
          <xsl:attribute name="style">
           <xsl:apply-templates select="span"/>
          </xsl:attribute>
          <xsl:apply-templates select="node()[not(self::span)]"/>
       </span>
     </para>
 </xsl:template>

 <xsl:template match="span[@class='bidi']">
  <xsl:if test="position() >1"><xsl:text> </xsl:text></xsl:if>
  <xsl:text>direction:rtl;</xsl:text>
 </xsl:template>

 <xsl:template match="span[@class='ind']">
  <xsl:if test="position() >1"><xsl:text> </xsl:text></xsl:if>
  <xsl:text>text-indent:10pt;</xsl:text>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档时:

<para><span class="bidi"/><span class="ind"/>1</para>

会产生想要的正确结果:

<para><span style="direction:rtl; text-indent:10pt;">1</span></para>