2009-01-05 59 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指令的值或副本。