XSL: разбить строку на теги на основе регулярных выражений - PullRequest
0 голосов
/ 17 октября 2018

Я работаю в XSLT 2.0 и испытываю проблемы с наматыванием тегов на части строки.Вот что у меня есть:

<dc:subject>Red&#xD;
            Green&#xD;
            Blue
</dc:subject>

и желаемый результат:

<subject>
  <topic>Red</topic>
  <topic>Green</topic>
  <topic>Blue</topic>
</subject>

Я знаю, что могу использовать substring-before(), чтобы захватить что-нибудь перед разделителем, но я не знаюкак использовать его рекурсивно, чтобы получить каждый экземпляр перед разделителем;с другой стороны, так как я нахожусь в 2.0, я могу использовать replace(), чтобы поразить все вхождения, но он не примет угловую скобку, поэтому я не могу просто сказать, чтобы обернуть каждое вхождение в теги <topic>.Что мне здесь не хватает?

<xsl:value-of select="replace(dc:subject, '.*&#xD;','????')"/>

или

<xsl:value-of select="substring-before(dc:subject, '&#xD;')"/>

Спасибо!

1 Ответ

0 голосов
/ 17 октября 2018

Вы создаете новые узлы здесь, так что это неправильный подход к использованию replace, который заключается исключительно в замене строк другими строками.

Вы можете использовать tokenize здесь, чтобы разбить строку,а затем используйте xsl:for-each, чтобы создать новый topic для каждой детали

<subject>
  <xsl:for-each select="tokenize(dc:subject, '&#xD;')">
     <topic>
       <xsl:value-of select="normalize-space(.)" />
     </topic>
  </xsl:for-each>
</subject>
...