У меня есть 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>
Может ли кто-нибудь предложить какую-либо помощь относительно того, как я могу отобразить это как «Полиция подтвердила, что допрашивает человека»?
Большое спасибо.





попробуйте это добавить & nbsp; после значения тега
Просто определите символ в начале вашего xslt, чтобы решить проблему: <! DOCTYPE xsl: stylesheet [<! ENTITY nbsp "& # 160;">]>
Вы можете условно добавить пробел между словами в зависимости от позиции слова. В следующем фрагменте показано, как добавить пробел после всего, кроме последнего слова.
<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> в моем фрагменте кода)
Вы, вероятно, уже знаете это, но для полноты картины я бы посоветовал не использовать "//" из соображений производительности. если вы знаете полный путь к интересующим вас узлам, сообщите об этом движку, иначе ему придется сканировать весь документ на предмет возможных совпадений.
это быстрый фрагмент кода, созданный, чтобы показать решение конкретной проблемы, а не руководство по кодированию
Добавьте пробел.
Простой способ:
<Paragraph>
<xsl:for-each select = "./speaker/segment">
<xsl:value-of select = "./nbest"/> 
</xsl:for-each>
</Paragraph>
Чуть более сложный способ эффективно обрезать строку:
<Paragraph>
<xsl:for-each select = "./speaker/segment">
<xsl:if test = "not(position() = 1)"> </xsl:if>
<xsl:value-of select = "./nbest"/>
</xsl:for-each>
</Paragraph>
И некоторые способы xpath: нормализовать пространство, подстрока перед, подстрока после в различных формах.
Это добавит неразрывный пробел, что будет означать, что вывод нельзя обернуть, & # 32; будет нормальное пространство.
это почти как ответ "аку". Но ответ «аку» создает один абзац.
<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 = "." /> 
</xsl:template>
Пробелы значительны, поэтому, если в приведенном выше решении вы обнаружите, что это беспорядок, вы можете обернуть его внутри узла <xsl:text/>, и пробелы исчезнут.
Затем, когда слово node совпадает, вы получаете его через интервал. Примечание: в конце будет дополнительное место. Чтобы избавиться от этого, потребуется немного больше времени.
<xsl:temmplate match = "word">
<xsl:value-of select = "." />
<xsl:if test = ". !=../word[last()]">
<xsl:text> </xsl:text>
</xsl:if>
</xsl:template>
Это будет работать только при применении шаблонов, но не при использовании директив value-of или copy-of xsl.
причина не в том, что "встроенный" (что бы вы под этим ни подразумевали) и применялись-шаблоны, просто XSLT не учитывает пробелы в разных строках. Решением является вставка символа пробела через хеш-код или xsl: text. Кроме того, ваш тест позиции будет относительно медленным.
Вот некоторая информация о правилах встроенного шаблона. w3.org/TR/xslt#built-in-rule
не то чтобы я проголосовал против вас, но вам нужно будет определить сущность