2012-07-06 138 views
2

我有以下標記。將匹配元素屬性合併到單個元素中

<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以及它們的所有類屬性值?

+0

您定位哪個XSLT版本?對於XSLT 2.0的「for-each-group group-adjacent」似乎是一個工作。 – 2012-07-06 17:38:54

+0

我正在使用2.0版。 – Jeff 2012-07-06 18:20:48

回答

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> 
+0

嗨迪米特雷,一如既往地感謝您的迴應。不過,這適用於para級屬性(我可以測試),但我希望保留內聯屬性(即粗體,斜體)內容的元素。 – Jeff 2012-07-06 18:39:14

+0

@Jeff:哦,我明白了......看看最新的答案。 – 2012-07-06 18:49:03

+0

@Dimitri謝謝。這工作。測試單個跨度是否具有稱爲paraProperty的屬性的最佳方法是什麼? – Jeff 2012-07-06 19:59:35