2013-12-14 2 views
0

Я группирую смежные «встроенные» элементы со следующим XSLT 2.0, но ни один из текстовых() узлов не копируется, кто-нибудь знает почему? Источник XML:XSLT2.0-Group Смежный не копирующий текст()

<para> 
     <p>some text</p> 
     <section> 
     <section> 
     <inline>inline text</inline> 
     <inline/> 
     <p>some more text</p> 
     <p/> 
     </section> 
     <para> 
     <p>dog</p> 
     <p/> 
     <p/> 
     <sub-para> 
      <p/> 
      <p/> 
     </sub-para> 
     </para> 
     </section> 
    </para> 

Мой XSLT 2.0 таблица стилей имеет 2 шаблона спички (для текста()) и * (для любого элемента)

<xsl:template match="text()"> 
    <xsl:copy /> 
    </xsl:template> 

    <xsl:template match="*"> 
     <xsl:copy> 
     <xsl:for-each-group select="*" group-adjacent="boolean(self::inline)"> 
      <xsl:choose> 
       <xsl:when test="current-grouping-key()"> 
        <grp><xsl:copy-of select="current-group()"/></grp> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:apply-templates select="current-group()"/> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:for-each-group> 
     </xsl:copy> 
    </xsl:template> 

Результаты, которые я в настоящее время получают являются:

<para> 
    <p/> 
    <section> 
     <section> 
     <grp> 
     <inline>inline text</inline> 
     <inline/> 
     </grp> 
     <p/> 
     <p/> 
     </section> 
     <para> 
     <p/> 
     <p/> 
     <p/> 
     <sub-para> 
     <p/> 
     <p/> 
     </sub-para> 
     </para> 
    </section> 
    </para> 

т.е. элементы скопированы, смежные встроенные элементы сгруппированы, но текстовые узлы не копируются.

Почему не вызывает apply-templates select = current-group() приводит к вызову шаблона text()?

Большое спасибо за любые ответы

ответ

0

Инструкцией <xsl:for-each-group select="*" выбирает узлы дочерний элемент, а не ребенок текстовые узлы. Таким образом, текстовые узлы не будут частью какой-либо группы и поэтому не будут скопированы.

Тот факт, что у вас есть правило шаблона, которое соответствует текстовым узлам, не имеет значения, потому что вы никогда не применяете шаблоны к текстовому узлу.

Если вы изменили для каждой группы также выбор текстовых узлов (написав select="node()"), возникает проблема, что элементы «inline» больше не будут смежными, поскольку они разделены узлами текстового текста.

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

0

Как говорит мистер Майкл Кей, вы только выбираете элементы, а не узлы, и поэтому ваши текстовые узлы никогда не будут обработаны.

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

<xsl:template match="*[not(*)]"> 
     <xsl:copy> 
      <xsl:apply-templates /> 
    </xsl:copy> 
</xsl:template> 

Поскольку этот шаблон имеет состояние указанное, он должен, как мне кажется, имеет приоритет над существующим шаблоном, когда условие истинно.

На самом деле, это даже может быть упрощено до этого

<xsl:template match="*[not(*)]"> 
     <xsl:copy-of select="." /> 
</xsl:template> 

Стоит также отметить, что текущий шаблон соответствие текста() на самом деле не требуется, применять ли вы шаблоны для текстового узла или не. XSLT имеет концепцию встроенных шаблонов, которые используются, когда в XSLT не найдено явного соответствия шаблона узлу. Эти встроенные шаблоны будут выводить текстовые узлы, если они когда-либо будут использоваться, поэтому весь ваш шаблон «text()» - это то, что построил шаблон в любом случае.

+0

Спасибо Тим, этот подход не работает для смешанного контента, например: 'code'

Таблица A: Пример

, где должны быть соединены два встроенных элемента. Текст потерян. Это простое требование, но я потратил дни на то, чтобы решить его с помощью XSLT 2 – user3101286

+0

Вы уверены, что текст потерян, потому что мне кажется, что это нормально, хотя я, возможно, неправильно понял точное требование! Я думаю, что это могло бы помочь, если бы вы могли отредактировать свой вопрос, чтобы показать пример со «смешанным контентом» и, что более важно, показать результат, который вы ожидаете в этом случае. Спасибо! –

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