Xml xslt вопрос

У меня есть 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>

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 144
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

не то чтобы я проголосовал против вас, но вам нужно будет определить сущность

annakata 05.01.2009 13:21

Просто определите символ в начале вашего xslt, чтобы решить проблему: <! DOCTYPE xsl: stylesheet [<! ENTITY nbsp "& # 160;">]>

gizmo 05.01.2009 13:29

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

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

Вы, вероятно, уже знаете это, но для полноты картины я бы посоветовал не использовать "//" из соображений производительности. если вы знаете полный путь к интересующим вас узлам, сообщите об этом движку, иначе ему придется сканировать весь документ на предмет возможных совпадений.

Yossi Dahan 05.01.2009 13:31

это быстрый фрагмент кода, созданный, чтобы показать решение конкретной проблемы, а не руководство по кодированию

aku 05.01.2009 13:36
Ответ принят как подходящий

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

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

<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: нормализовать пространство, подстрока перед, подстрока после в различных формах.

Это добавит неразрывный пробел, что будет означать, что вывод нельзя обернуть, & # 32; будет нормальное пространство.

davidsheldon 08.01.2009 17:48

это почти как ответ "аку". Но ответ «аку» создает один абзац.

 <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>

Причина, по которой они работают вместе, заключается в том, что таблица стилей использует встроенный шаблон, для сопоставления с которым сворачивается пустое пространство. Я не вижу, где вы явно вызываете <word/> или окружающий XML, поэтому я предполагаю, что это где-то вызов <xsl:apply-templates />. Вам просто нужно просто определить шаблон соответствия как таковой:

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

Пробелы значительны, поэтому, если в приведенном выше решении вы обнаружите, что это беспорядок, вы можете обернуть его внутри узла <xsl:text/>, и пробелы исчезнут.

Затем, когда слово node совпадает, вы получаете его через интервал. Примечание: в конце будет дополнительное место. Чтобы избавиться от этого, потребуется немного больше времени.

<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.

причина не в том, что "встроенный" (что бы вы под этим ни подразумевали) и применялись-шаблоны, просто XSLT не учитывает пробелы в разных строках. Решением является вставка символа пробела через хеш-код или xsl: text. Кроме того, ваш тест позиции будет относительно медленным.

annakata 05.01.2009 14:22

Вот некоторая информация о правилах встроенного шаблона. w3.org/TR/xslt#built-in-rule

null 05.01.2009 16:13

Другие вопросы по теме