2016-04-27 11 views
0

XSLT - 置か自ノードのテキスト()は次のように私はAAサンプルXMLを持って

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

は、XSLTを使用して属性のために私は、同じノードツリーに、この変換が、'name'という名前<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属性の値aと、すべてのインライン要素(<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

これは少し厄介である、それは単にあなたの場合はAAAAA BBBCCC DDDEEEEFFFFF GGGGHHHHHH

を与え、すべての子孫テキスト・ノードを連結してしまうため、ちょうど<p name="{.}">を使用しての明白な答えは動作しません。隣接するテキストノードの間にXMLタグがある場合は、空白があることを確認して、少し創造的にする必要があります。これは、それらの間の余分なスペースを持つすべてのテキストノードを結合し

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

を試してみて、その後、ノーマライズは1までの隣接する二つのスペースを潰すます。

1

なぜ単純ではない:

<xsl:template match="para"> 
    <p name="{.}"> 
     <xsl:apply-templates/> 
    </p> 
</xsl:template> 
関連する問題