2016-04-27 80 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>