2013-02-06 50 views
0

我有一些簡單的XML像這樣...換行符

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <sentence> 
     <word1>The</word1> 
     <word2>cat</word2> 
     <word3>sat</word3> 
     <word4>on</word4> 
     <word5>the</word5> 
     <word6>mat</word6> 
    </sentence> 
    <sentence> 
     <word1>The</word1> 
     <word2>quick</word2> 
     <word3>brown</word3> 
     <word4>fox</word4> 
     <word5>did</word5> 
     <word6>nothing</word6> 
    </sentence> 
</root> 

我希望能夠做的就是這個過程用XSLT創建一個句子,這樣 的〜貓(這是我最終希望能夠做的一個簡單的例子,這只是現在的一個絆腳石)。

我的XSLT看起來像這樣;

<?xml version="1.0" encoding="UTF-8"?> 
    <xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output indent="no" /> 
    <xsl:template match="text()[not(string-length(normalize-space()))]"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/"> 
     <xsl:text>&#xa;</xsl:text> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="/root/sentence"> 
     <xsl:apply-templates /> 
     <xsl:text>&#xa;</xsl:text> 
    </xsl:template> 

    <xsl:template match="word1"> 
     <xsl:value-of select="text()" /> 
     ~ 
    </xsl:template> 

    <xsl:template match="word2"> 
     <xsl:value-of select="text()" /> 
     ~ 
    </xsl:template> 

    <xsl:template match="word3"> 
     <xsl:value-of select="text()" /> 
     ~ 
    </xsl:template> 

    <xsl:template match="word4"> 
     <xsl:value-of select="text()" /> 
     ~ 
    </xsl:template> 

    <xsl:template match="word5"> 
     <xsl:value-of select="text()" /> 
     ~ 
    </xsl:template> 

    <xsl:template match="word6"> 
     <xsl:value-of select="text()" /> 
     ~ 
    </xsl:template> 
</xsl:stylesheet> 

如果我跑過來的XML樣式表我得到一條線的每個字的它自己的,然後在下一行蒂爾達,這樣

<?xml version="1.0" encoding="UTF-8"?> 
The 
     ~ 
    cat 
     ~ 
    sat 
     ~ 
    on 
     ~ 
    the 
     ~ 
    mat 
     ~ 

The 
     ~ 
    quick 
     ~ 
    brown 
     ~ 
    fox 
     ~ 
    did 
     ~ 
    nothing 
     ~ 

如果我刪除tildas我得到

Thecatsatonthemat 

它看起來對我,然後(我是新來這個XSLT東西),一個蒂爾達對在新線納入正迫使新線。

那麼,我該如何強制模板的輸出全部在一行? (我最後的要求是對元素進行更多的格式化,並使用空格來填充元素 - 稍後我會介紹)。

由於在期待

回答

3

更改~<xsl:text>~</xsl:text>

+0

這當然有訣竅。謝謝 – Nerdio

1

出現這種情況的原因是,當非空白文本直接出現一個xsl:template和內部元素,所有文本非之間 - 空格屬於包含在結果中(包括任何空格)。爲了避免這種情況,你應該這樣做:

<xsl:template match="word1"> 
    <xsl:value-of select="concat(text(), '~')" /> 
</xsl:template> 

我還建議消除這些字詞1,單詞2等是幾乎相同的模板,並與一個模板替換他們:

<xsl:template match="*[starts-with(name(), 'word')]"> 
    <xsl:value-of select="concat(text(), '~')" /> 
</xsl:template> 
+0

謝謝你的回答,我會試試這個。順便說一下,word1,word2只是「簡單」例子的一部分。我真正的XML具有不同名稱和類型的元素。 – Nerdio

+0

這當然有效,並且concat()函數將會很有用。 – Nerdio

+0

瞭解word1,2,3等。正如其他答案所示,'xsl:text'也可以在這裏使用,但是當已經有'xsl:value-of'參數時,我更喜歡使用'concat()因爲'xsl:text'通常會在XSLT中佔據一個額外的行,並且會通過其開始和結束標記創建額外的混亂。 – JLRishe

0

簡單<xsl:value-of select="text()" />之間刪除換行符〜作品對我來說

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output indent="no" /> 
    <xsl:template match="text()[not(string-length(normalize-space()))]"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/"> 
    <xsl:text>&#xa;</xsl:text> 
    <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="/root/sentence"> 
    <xsl:apply-templates /> 
    <xsl:text>&#xa;</xsl:text> 
    </xsl:template> 

    <xsl:template match="word1"> 
    <xsl:value-of select="text()" />~</xsl:template> 

    <xsl:template match="word2"> 
    <xsl:value-of select="text()" />~</xsl:template> 

    <xsl:template match="word3"> 
    <xsl:value-of select="text()" />~</xsl:template> 

    <xsl:template match="word4"> 
    <xsl:value-of select="text()" />~</xsl:template> 

    <xsl:template match="word5"> 
    <xsl:value-of select="text()" />~</xsl:template> 

    <xsl:template match="word6"> 
    <xsl:value-of select="text()" />~</xsl:template> 
</xsl:stylesheet> 

結果:

<?xml version="1.0" encoding="utf-8"?> 
The~cat~sat~on~the~mat~ 
The~quick~brown~fox~did~nothing~