xml xslt问题

时间:2009-01-05 09:54:26

标签: xml xslt

我有一个xml,其中包含“word”元素中的文本,例如

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

问题是,当我应用xslt时,文本显示为“Policeconfirmedthey arequestioningaman”。

以下是执行此转换的xslt片段

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

任何人都可以提供任何帮助,我可以将其显示为“警方证实他们正在质疑男人”吗?

非常感谢。

5 个答案:

答案 0 :(得分: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中的信息来了解如何在我的代码段中添加空格(而不是&lt; xst:text&gt;)

答案 1 :(得分: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方式: normalize-space substring-before substring-after 以各种形式。

答案 2 :(得分: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>

答案 3 :(得分: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> 

这仅适用于apply-templates,而不适用于使用xsl指令的value-of或copy-。

答案 4 :(得分:0)

试试这个添加&amp; npsp;在标签值

之后