xml xslt вопрос - PullRequest
       23

xml xslt вопрос

1 голос
/ 05 января 2009

У меня есть xml с текстом внутри "word" элементов, например,

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

Проблема в том, что когда я применяю xslt, текст выглядит как "Полиция подтвердила, что они спрашивают человека".

Вот фрагмент xslt, который выполняет это преобразование

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

Может ли кто-нибудь предложить какую-либо помощь относительно того, как я могу отобразить это как «Полиция подтвердила, что они допрашивают человека»?

Большое спасибо.

Ответы [ 5 ]

4 голосов
/ 05 января 2009

Вы можете условно добавить пробел между словами в зависимости от положения слова. В следующем фрагменте показано, как добавить пробел после последнего слова.

<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, вы можете использовать информацию из этого поста , чтобы узнать, как добавить пробел (вместо в моем фрагменте кода)

3 голосов
/ 05 января 2009

Добавить пробел.

Простой способ:

<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 голосов
/ 05 января 2009

Причина, по которой они выполняются вместе, заключается в том, что таблица стилей использует встроенный шаблон, для сравнения которого сворачивается пробел. Я не вижу, где вы явно вызываете <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> 

Это будет работать только при применении шаблонов, но не при использовании директив value-of или copy-of xsl.

2 голосов
/ 05 января 2009

это почти как "аку" ответ. Но ответ «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>
0 голосов
/ 05 января 2009

попробуйте добавить & npsp; после значения тега

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...