2011-01-18 1 views
2

я должен применять шаблоны для узла в настоящее время между двумя узламинужно принимать значение узла между двумя узлами

Ex ..

<w:p w:rsidR="00EF034A" w:rsidRDefault="00360D3B"> 
<w:commentRangeStart w:id="0"/> 
<w:r> 
<w:t>Comments</w:t> 
</w:r> 
<w:commentRangeEnd w:id="0"/> 
<w:r> 
<w:rPr> 
<w:rStyle w:val="CommentReference"/> 
</w:rPr> 
<w:commentReference w:id="0"/> 
</w:r> 
</w:p> 

я должен применить-шаблоны для узлов представляют промежуточные commentRangeStart и commentRangeEnd. Пожалуйста, помогите мне в написании шаблона xslt. Заранее спасибо

+0

Это не ясно, если вы хотите ** выбрать ** эти узлы или вы хотите ** сопоставить ** их (как в шаблоне). Кроме того, есть много ответов на эту задачу группировки ... –

+0

Хороший вопрос, +1. См. Мой ответ для полного однострочного решения. :) –

ответ

3

Вот простой XPath 1.0 (XSLT 1.0) раствор в дополнение к полному ответу доктора Кей:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:w="w:w"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="/"> 
    <xsl:apply-templates select= 
    "*/w:p/w:commentRangeStart[@w:id=0] 
      /following-sibling::node() 
       [following-sibling::w:commentRangeEnd[@w:id=0] ] 
    "/> 
</xsl:template> 
</xsl:stylesheet> 

когда это преобразование применяется на прилагаемом документе XML (завернутые в верхний элемент, чтобы быть хорошо сформированной):

<t xmlns:w="w:w"> 
    <w:p w:rsidR="00EF034A" w:rsidRDefault="00360D3B"> 
     <w:commentRangeStart w:id="0"/> 
     <w:r> 
      <w:t>Comments</w:t> 
     </w:r> 
     <w:commentRangeEnd w:id="0"/> 
     <w:r> 
      <w:rPr> 
       <w:rStyle w:val="CommentReference"/> 
      </w:rPr> 
      <w:commentReference w:id="0"/> 
     </w:r> 
    </w:p> 
</t> 

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

<w:r xmlns:w="w:w"> 
    <w:t>Comments</w:t> 
</w:r> 
+0

Его работа ... Большое спасибо Dimitre Novatchev ... – vignesh

+0

@vignesh: Я рад, что мое решение было полезно. Может быть, вы не осознаёте, что в благодарность SO выражается принятие или отсрочка ответа? Подсказка: вы можете принять ответ, нажав на зеленую галочку рядом с ним. –

+0

Рад получить ваш ответ Dimitre. Я застрял в преобразовании листинга в файл docx в html (жесткий в поддержании порядка списка, если он имеет изображение и таблицу между ними). ​​У вас есть какие-либо xsl-шаблоны для выполнения операции. Это будет действительно полезно для меня. Спасибо заранее. – vignesh

3

Похоже, вы имеете дело с параллельной/перекрывающейся разметкой, где элементы commentrangestart и commentrangeend действуют как теги «веха». Существует обширная литература по обработке перекрывающейся разметки, и было бы полезно потратить некоторое время на изучение предмета.

Детали немного зависят от того, существует ли только один комментарий в пределах родительского элемента, всегда ли он начинается и заканчивается внутри одного и того же элемента и так далее.

В XSLT 2.0 вы можете обрабатывать такие конструкции с помощью <xsl:for-each-group group-starting-with="commentrangestart"> или <xsl:for-each-group group-ending-with="commentrangeend">. Вы также можете использовать операторы < < и >>, например <xsl:for-each select="*[. &gt;&gt; $start and . &lt;&lt; $end]">.

Если вы застряли с XSLT 1.0, это намного сложнее, но не невозможно. Методика использования (которая заслуживает изучения, потому что она также полезна с XSLT 2.0) называется «рекурсия сестры». Вы пишете шаблон, соответствующий элементу commentrangestart, и делает <xsl:apply-templates mode="sibling" select="following-sibling::*[1]"/>; у вас есть два правила шаблона в режиме = «собрат», один из которых соответствует элементу commentrangeend и оканчивающейся рекурсию, другие процессы элементов между ними, и приходит к выводу, выполнив рекурсивный вызов <xsl:apply-templates mode="sibling" select="following-sibling::*[1]"/>

+0

Я использую только xslt 1.0 .. как справиться с ними в нем. – vignesh

+0

+1 Полное объяснение. –

+0

@vignesh: В дополнение к доктору Майклу Кэю полное объяснение, в XSLT 1.0 есть другая методика с использованием ключей: объявление значения ключа как предыдущего и следующих меток с помощью 'fn: generate-id()' и восстановление этих узлов при сопоставлении запуска отметка. –

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