2014-11-09 3 views
1

У меня есть следующий XML:символов до первого дочернего узла и после последнего дочернего узла в XSLT

<line> 
     <orig><gap quantity="4" unit="chars" reason="illegible"/> <gap quantity="4" 
     unit="chars" reason="illegible"/> <gap quantity="3" unit="chars" 
     reason="illegible"/> <gap quantity="5" unit="chars" reason="illegible"/> 
     shal <gap quantity="2" unit="chars" reason="illegible"/> <gap 
     quantity="12" unit="chars" reason="illegible"/> </orig> 
</line> 

я хотел бы применить некоторые стили к нему таким образом, что каждый раз, когда существует последовательность узлов в строка, первый узел зазора предваряется левой квадратной скобкой, а за последним узлом следует прямоугольная квадратная скобка. Число точек, взятых из элемента @quantity in, будет отображаться для каждого узла разметки. Так, например, xml выше должен выглядеть следующим образом:

[.... .... .... ....] shal [.. ............]

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

[.... .... ... ..... ШЭЛ .. ............]

Мой код XSLT здесь:

<xsl:template match="tei:orig/tei:gap"> 
    <xsl:variable name="max" select="@quantity"/> 
    <xsl:if test="not(preceding-sibling::tei:gap)"> 
     <xsl:text>[</xsl:text> 
    </xsl:if> 
    <xsl:for-each select="1 to $max"> 
     <xsl:text>.</xsl:text> 
    </xsl:for-each> 
    <xsl:if test="not(following-sibling::tei:gap)"> 
     <xsl:text>]</xsl:text> 
    </xsl:if>   
</xsl:template> 

Как обращаться с другими кронштейнами? Я думал, что смогу это сделать, написав шаблон, который применяется к узлу напрямую, увеличив уровень и используя position(), но это просто обертывает каждый набор точек в квадратных скобках вместо того, чтобы только обернуть начало и конец каждой последовательности узлов.

EDIT: Мой оригинальный образец XML был запутанным и неточно объяснял, что мне нужно сделать, поэтому, надеюсь, эта новая деталь поможет в этом отношении.

+0

У вас есть ** ** смежные пробелы, вы хотите сгруппировать? В вашем примере их нет, но вы тестируете предыдущие пробелы в браке, по-видимому, без уважительной причины. –

+0

Хорошая точка. Я схватил случайный пример (извините за это ... я спрашивал из аэропорта), но возможно, что линия имеет несколько смежных разрывов, разделенных пробелом.Моя цель состоит в том, чтобы проверить, что предшествует родной брат, и после того, как братец должен был получить первый и последний промежутки, хотя я полагаю, что мне действительно нужен первый и последний пробел в любой их группировке в узле . – medievalmatt

+0

Ух, извините за ужасный комментарий ... автокоррекция телефона раздражает. – medievalmatt

ответ

1

Если - как вам кажется, вы используете XSLT 2.0, вы можете использовать команду <xsl:for-each-group> для группировки смежных элементов gap. Например, следующая таблица стилей:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xsl:output method="text" encoding="UTF-8" /> 
<xsl:strip-space elements="*"/> 

<xsl:template match="orig"> 
    <xsl:for-each-group select="node()" group-adjacent="boolean(self::gap)"> 
     <xsl:choose> 
      <xsl:when test="current-grouping-key()"> 
       <xsl:text>[</xsl:text> 
        <xsl:for-each select="current-group()"> 
         <xsl:for-each select="1 to @quantity"> 
          <xsl:text>.</xsl:text> 
         </xsl:for-each> 
         <xsl:if test="position()!=last()"> 
          <xsl:text> </xsl:text> 
         </xsl:if> 
        </xsl:for-each> 
       <xsl:text>]</xsl:text> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="current-group()" separator=""/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:for-each-group> 
</xsl:template> 

</xsl:stylesheet> 

применительно к вашей (новый), например, возвратит:

[.... .... ... .....] 
     shal [.. ............] 
+0

Я использую 2.0. Я отредактировал свое оригинальное сообщение, чтобы показать что-то более похожее на то, с чем я имею дело, и применил ваше исправление к нему. В результате я получаю [....] [....] [...] [.....] shal [..] [........... .], и что я хотел бы получить в результате [.... .... ... .....] shal [.. ............] , – medievalmatt

+0

@medievalmatt Я не могу воспроизвести ваш результат. Я немного отредактировал свой ответ, чтобы удовлетворить потребность в пространстве, разделяющем группы точек, но это не имеет отношения к вашему комментарию. - P.S. Обратите внимание на инструкцию '' в моей таблице стилей. –

+0

Добавление «tei: orig» в мой список элементов в strip-space устраняет проблему, с которой я столкнулся, когда я запускаю ее только по той строчке, которую я предоставил, но в моей реальной реализации я сейчас получаю странную вещь, где мой текст повторяется. Тем не менее, ваше исправление работает для того, что я предоставлял, и я могу попытаться решить это самостоятельно. Спасибо! – medievalmatt

0

Не могли бы вы предоставить более подробную информацию о том, где вы обнаружили проблему? Я просто написал, как например, после XSLT

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output method="xml" doctype-public="XSLT-compat" omit-xml-declaration="yes" 
encoding="UTF-8" indent="no" /> 
<xsl:strip-space elements="*"/> 
<xsl:template match="/"> 
    <xsl:apply-templates/> 
</xsl:template> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="hi"> 
    <xsl:value-of select="."/> 
</xsl:template> 
<xsl:template match="orig | line"> 
    <xsl:apply-templates/> 
</xsl:template> 
<xsl:template match="gap"> 
<xsl:variable name="max" select="@quantity"/> 
<xsl:text>[</xsl:text> 
<xsl:for-each select="1 to $max"> 
    <xsl:text>.</xsl:text> 
</xsl:for-each> 
<xsl:text>]</xsl:text> 
</xsl:template> 
</xsl:stylesheet> 

При подаче на вход XML

<line> 
    <orig><hi>W</hi>e be <gap quantity="4" unit="chars" reason="illegible"/> 
     ed and moeued of <gap quantity="6" unit="chars" reason="illegible"/> 
    </orig> 
</line> 

следующий вывод производится

We be [....]ed and moeued of [......] 

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

+0

Как я уже упоминал выше, я выбрал плохой пример кода примера. Возможно наличие двух смежных узлов. Когда это произойдет, мне нужны скобки для группировки, а не отдельные элементы. Вот почему я использовал предыдущего брата. Когда я вернусь домой и не отвечу на мой телефон, я приведу еще один пример, который может лучше проиллюстрировать проблему. – medievalmatt

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