39002


次の様なXMLがあります．

[code]

    <?xml version="1.0" encoding="UTF-8"?>
    <sect>
        <p>  donguri korokoro 
            donburiko    </p>
        <p>koike ni hamatte saa         taihen</p>
        <p>dojyou      mo  detekite    konnnitiwa</p>
        <p>   bocchann isshoni     asobimasho    </p>
    </sect>
    
[/code]

これから`<p>`を単位としてホワイトスペースを正規化して行にし

[code]

    donguri korokoro donburiko
    koike ni hamatte saa taihen
    dojyou mo detekite konnnitiwa
    bocchann isshoni asobimasho
    
[/code]

というテキスト出力を得たいです．最終行には改行はなくてかまいません．  
今まではこんなスタイルシートを作っていましたが、

[code]

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        exclude-result-prefixes="xs"
        version="2.0">
    
        <xsl:output method="text" encoding="UTF-8"/>
    
        <xsl:template match="/">
            <xsl:for-each select="sect/p">
                <xsl:value-of select="normalize-space(.)"/>
                <xsl:if test="position() ne last()">
                    <xsl:text>&#x0A;</xsl:text>
                </xsl:if>
            </xsl:for-each>
        </xsl:template>
    
    </xsl:stylesheet>
    
[/code]

xsl:for-
eachがあったり、xsl:ifがあったりといまいちスッキリしません．もっと単純に（一発で）結果を得られるようにはできないものでしょうか？スタイルシートはXSLT
2.0以上で結構です．

以上 よろしくお願いします．


CC BY-SA 3.0
2017-10-24T04:11:43.940
38988
2017-10-25T00:08:16.923
9503
question
xpath xsl xslt
XMLからの正規化した行の出力


質問のスタイルシートに

[code]

    <xsl:if test="position() ne last()">
      <xsl:text>&#x0A;</xsl:text>
    </xsl:if>
    
[/code]

という処理ありますので、metropolisさんの回答にあるテンプレート

[code]

    <xsl:template match="sect/p">
      <xsl:value-of select="concat(normalize-space(), '&#xA;')"/>
    </xsl:template>
    
[/code]

を

[code]

    <xsl:template match="sect/p">
      <xsl:value-of select="if (position() eq last()) then normalize-space(.) else concat(normalize-space(.), '&#xA;')"/>
    </xsl:template>
    
[/code]

のように if式を使うようにすると、最終行に改行が付かないようにすることもできます。


CC BY-SA 3.0
2017-10-24T08:04:37.970
38994
2017-10-24T08:04:37.970
21153
38988
answer


normalize-space を施した 要素p の文字列値のシーケンス に対して，  
separator で改行を指定して分割する方法があります。

[code]

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        exclude-result-prefixes="xs"
        version="2.0">
    
        <xsl:output method="text" encoding="UTF-8"/>
    
        <xsl:template match="/">
            <xsl:value-of select="sect/p/normalize-space(.)" separator="&#x0A;"/>
        </xsl:template>
    
    </xsl:stylesheet>
    
[/code]


CC BY-SA 3.0
2017-10-24T12:06:35.213
39002
2017-10-25T00:08:16.923
2017-10-25T00:08:16.923
25399
25399
38988
answer