2016-04-27 57 views
0

我有AA示例XML類似如下,XSLT - 放置自節點文本()來

<doc> 
    <para>AAAAA BBB<s/>CCC DDD<l/>EEEE<t/>FFFFF <style>GGGG</style>HHHHHH</para> 
</doc> 

使用XSLT屬性我有這個轉換爲同一節點樹,但添加一個名稱屬性<para>節點命名'name'和它的值應該是<para>元素的內容文本。

所以輸出應該是什麼樣子,

<doc> 
    <p name="AAAAA BBB CCC DDD EEEE FFFFF GGGG HHHHHH">AAAAA BBB<s/>CCC DDD<l/>EEEE<t/>FFFFF <style>GGGG</style>HHHHHH</p> 
</doc> 

正如你可以在輸出中看到,所有的文本節點應該被複制到name屬性值和所有的內聯元素(<s/>,<t/>,<l/>,<style>)必須除去。並且所有<s/>,<t/>,<l/>必須用空格替換。

我寫了下面的XSLT爲此,

<xsl:template match="p"> 
     <p name="{abc:process-attr-text(child::node())}"> 
      <xsl:apply-templates/> 
     </p> 
    </xsl:template> 

    <xsl:function name="abc:process-attr-text"> 
     <xsl:param name="node"/> 

     <xsl:sequence select="$node/text()"/> 
    </xsl:function> 

它提供了以下輸出,

<doc> 
    <p name="GGGG">AAAAA BBB<s/>CCC DDD<l/>EEEE<t/>FFFFF <style>GGGG</style> HHHHHH</p> 
</doc> 

如何修改我的函數來得到正確的結果?

回答

4

這是略顯尷尬,只是用<p name="{.}">不會工作,因爲它只會串連所有後代文本節點的明顯的答案,給AAAAA BBBCCC DDDEEEEFFFFF GGGGHHHHHH

如果您要確保在相鄰文本節點之間存在XML標籤的地方存在空間,那麼您需要更具創造性。嘗試

<p name="{normalize-space(string-join(descendant::text(), ' '))}"> 

這都加入與他們之間的額外空間的文本節點,然後將正常化壁球兩個相鄰的空間降到一個。

1

爲什麼不乾脆:

<xsl:template match="para"> 
    <p name="{.}"> 
     <xsl:apply-templates/> 
    </p> 
</xsl:template>