2009-01-05 95 views
1

我有了中「字」文本的XML元素e.gXML XSLT的問題

<word>Police</word> 
<word>confirmed</word> 
<word>they are</word> 
<word>questioning</word> 
<word>a</word> 
<word>man</word> 

問題是,當我申請文本看起來像「Policeconfirmedthey arequestioningaman」的XSLT。

這裏是XSLT片段,它這個變換

<Paragraph> 
<xsl:for-each select="./speaker/segment"> 
<xsl:value-of select="./nbest"/> 
</xsl:for-each> 
</Paragraph> 

任何人都可以提供任何幫助,我怎麼能顯示這是「警方證實,他們都在質疑男人」?

非常感謝。

回答

3

添加一個空格字符。

簡單的方法:

<Paragraph> 
<xsl:for-each select="./speaker/segment"> 
    <xsl:value-of select="./nbest"/>&#160; 
</xsl:for-each> 
</Paragraph> 

稍微複雜一點的方法來有效地修剪字符串:

<Paragraph> 
<xsl:for-each select="./speaker/segment"> 
    <xsl:if test="not(position() = 1)">&#160;</xsl:if> 
    <xsl:value-of select="./nbest"/> 
</xsl:for-each> 
</Paragraph> 

和一些xpath方式:正常化空間子,前子 - 在以各種形式。

0

嘗試這種添加&npsp;的valueOf標籤

+0

不是我downvoted你,但你必須定義實體 – annakata 2009-01-05 10:21:26

+0

只要定義你的XSLT開頭的字符就可以解決這個問題: <!DOCTYPE的xsl:樣式表[<!ENTITY NBSP「 」>] > – gizmo 2009-01-05 10:29:01

4

後,您可以有條件地添加基於字的位置字之間的空間。以下片段顯示瞭如何在最後一個單詞之後添加空格。

<xsl:template match="//words"> 
    <xsl:for-each select="word"> 
     <xsl:value-of select="."/> 
     <!-- Check word's position --> 
     <xsl:if test="position()!=last()"> 
     <!-- Add a whitespace if it's not the last word --> 
     <xsl:text> </xsl:text> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template> 

如果你產生HTML輸出,你可以使用信息從this post找出如何添加一個空格(而不是< XST:在我的代碼段文本>)

+0

您可能已經知道這一點,但爲了完整起見,我建議不應因性能原因而使用'//'。如果你知道你感興趣的節點的完整路徑讓引擎知道,否則它將不得不掃描整個文檔以尋找可能的匹配結果 – 2009-01-05 10:31:50

+0

這是一個快速代碼片段,用於顯示特定問題的解決方案而不是編碼指南 – aku 2009-01-05 10:36:26

2

它幾乎就像「aku」的答案。 但是「aku」回答創造了一個段落。

<xsl:for-each select="./speaker/segment"> 
<Paragraph> 
    <xsl:for-each select="./nbest/word"/>   
     <xsl:value-of select="."/> 
     <xsl:if test="position()!=last()"> 
      <xsl:text> </xsl:text> 
     </xsl:if>   
    </xsl:for-each> 
</Paragraph> 
</xsl:for-each> 
2

他們在一起運行的原因是因爲樣式表使用內置模板來匹配摺疊空白。我沒有看到你在哪裏明確地調用了<word/>或周圍的XML,所以我假設它是在某個地方撥打<xsl:apply-templates />。你應該只需要只定義匹配模板,例如:

<xsl:template match="word"> 
    <xsl:value-of select="." />&#160; 
</xsl:template> 

空白是顯著,因此,如果在上述溶液中,你會發現它搞亂的東西,你可以在<xsl:text/>節點內包裹 ,和空白不見了。

然後,當字節點匹配時,你得到它的間隔。注意:最後會有額外的空間。爲了擺脫它會稍微長一些。

<xsl:temmplate match="word"> 
    <xsl:value-of select="." /> 
    <xsl:if test=". !=../word[last()]"> 
     <xsl:text>&#160;</xsl:text> 
    </xsl:if> 
</xsl:template> 

這隻適用於應用模板,而不適用於使用xsl指令的值或副本。