2016-01-18 3 views
0

Я не могу понять очень простую вещь!XSLT - преобразование списков определений (TEI)

Я пытаюсь написать шаблон для преобразования списков определений.

<list type="gloss"> 
    <head>Slovníček pojmů</head> 
    <label xml:lang="cs">Pojem</label> 
    <item>Dojem!</item> 
    <label xml:lang="cs">Stavba</label> 
    <item>Stavení</item> 
</list> 

текущий шаблон:

<xsl:template match="tei:list[@type='gloss']"> 
    <div class="glossary"> 
     <p> 
      <b> 
       <xsl:apply-templates select="tei:head"/> 
      </b> 
     </p> 
     <dl> 
      <xsl:choose> 
       <xsl:when test="tei:label"> 
        <dt> 
         <xsl:apply-templates select="tei:label"/> 
        </dt> 
       </xsl:when> 
       <xsl:otherwise> 
        <dd> 
         <xsl:apply-templates select="tei:item"/> 
        </dd> 
       </xsl:otherwise> 
      </xsl:choose> 
     </dl> 
    </div> 
</xsl:template> 

Ничего не работает. Я пробовал цикл for-each, что создает проблемы из-за применения шаблонов к атомным значениям. Внешние шаблоны (за пределами этого) обычно отображают тег head неправильным образом (дважды). Есть ли простой способ, как это сделать?

В приведенном выше шаблоне указанная ошибка указывает, что слишком много вложенных вызовов для шаблонов (таблица стилей может быть циклической).

+4

Вы можете показать больше ваш XML и XSLT, пожалуйста? Ваш XSLT ссылается на префикс пространства имен 'tei', но для этого вы не указали объявление пространства имен. Кроме того, ваш XML не имеет каких-либо пространств имен, поэтому он не будет соответствовать «tei: list». Вероятно, вы также должны показать шаблоны, которые соответствуют «head», «label» и «item», чтобы мы могли воспроизвести ошибку. Благодаря! –

ответ

1

Это должно работать с сниппеты вы публикуемыми:

<xsl:template match="list[@type='gloss']"> 
    <div class="glossary"> 
     <p> 
      <b> 
       <xsl:value-of select="head"/> 
      </b> 
     </p> 
     <dl> 
      <xsl:for-each select="label"> 
       <dt> 
        <xsl:value-of select="."/> 
       </dt> 
       <dd> 
        <xsl:value-of select="following-sibling::item[1]"/> 
       </dd> 
      </xsl:for-each> 
     </dl> 
    </div> 
</xsl:template> 

Или, если вы предпочитаете:

<xsl:template match="list[@type='gloss']"> 
    <div class="glossary"> 
     <xsl:apply-templates select="head"/> 
     <dl> 
      <xsl:apply-templates select="label | item"/> 
     </dl> 
    </div> 
</xsl:template> 

<xsl:template match="head"> 
    <p> 
     <b> 
      <xsl:value-of select="."/> 
     </b> 
    </p> 
</xsl:template> 

<xsl:template match="label"> 
    <dt> 
     <xsl:value-of select="."/> 
    </dt> 
</xsl:template> 

<xsl:template match="item"> 
    <dd> 
     <xsl:value-of select="."/> 
    </dd> 
</xsl:template> 

Результат

<div class="glossary"> 
    <p> 
    <b>Slovníček pojmů</b> 
    </p> 
    <dl> 
    <dt>Pojem</dt> 
    <dd>Dojem!</dd> 
    <dt>Stavba</dt> 
    <dd>Stavení</dd> 
    </dl> 
</div> 
+0

Не должно работать! В предоставленном шаблоне нет dl-тега. При этом проблема состоит в том, чтобы отделить голову и поставить ее над всем списком dl. В любом случае, спасибо! –

+0

@HonzaHejzl Я не уверен, что вы подразумеваете под этим. Является ли результат, показанный в моем ответе, отличным от ожидаемого результата? –

+1

@HonzaHejzl Легче ответить на вопрос, если вы покажете пример _complete_, который мы можем запустить сами. Для вопросов XSLT это означает: входной документ XML, таблицу стилей XSLT и ожидаемый результат XML. См. Http://stackoverflow.com/help/mcve. –

 Смежные вопросы

  • Нет связанных вопросов^_^