Советы по оптимальному циклу XML с XSLT - PullRequest
0 голосов
/ 21 сентября 2019

У меня есть проблема, когда мне нужно перебрать много строк и отформатировать отдельные элементы в каждой строке, которые соответствуют слову item.

Я могу сделать цикл и выяснить, как применить форматирование.Но моя проблема заключается в следующем: элемент появляется в конце строки, когда я применяю XSLT-преобразование.

Ниже я включил свой код.
Я использую функции XML for-each, value-of и if.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL    /Transform">
  <xsl:template match="/"> 
    <html>
      <body> 
        <h2>Title</h2> 
          <xsl:for-each select="song/l"> 
             <p> 
               <xsl:value-of select="current()"/>
               <xsl:if test="verb">
                  <span style="color:#ff0000"> 
                    <i><xsl:value-of select="verb"/></i>
                 </span>
               </xsl:if>              
            </p>   
          </xsl:for-each>    
        </body>
    </html> 
  </xsl:template> 
</xsl:stylesheet> 

Мой ввод:

<?xml version="1.0" encoding="UTF-8"?>

<song> 
   <l n="1">The fox <verb>jumps</verb> up high</l> 
   <l n="2">The frog is greener than a forest.</l> 
</song>

То, чего я надеюсь достичь, это:
Например, в такой строке, как

"The Brown fox jumps up high"

Слово jump помечено как глагол и должно быть другого цвета и выделено курсивом.

Мой код сейчас отображает

"The Brown fox jumps up high. jumps" 

Отформатирован правильно.
Мне это нужно дляудерживайте прыжки в той же позиции на линии, что и.
Любая помощь или совет приветствуются.

1 Ответ

1 голос
/ 21 сентября 2019

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

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/"> 
    <html>
      <body> 
        <h2>Title</h2>
        <xsl:apply-templates select="song/l"/>
      </body>
    </html> 
  </xsl:template> 

  <xsl:template match="verb">
    <span style="color:#ff0000; font-style:italic;">
      <xsl:apply-templates/>
    </span>
  </xsl:template>

  <xsl:template match="l">
    <p>
      <xsl:apply-templates/>
    </p>
  </xsl:template>
</xsl:stylesheet>

(я немного подправил, чтобы использовать font-style:italic; вместо элемента <i/>,но вы могли бы просто поместить <i> прямо в промежуток)

...