Необходимо принять значение узла между двумя узлами - PullRequest
2 голосов
/ 18 января 2011

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

Пример.

<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.Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 18 января 2011

Вот простое решение 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>
3 голосов
/ 18 января 2011

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

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

В 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]"/>; у вас есть два правила шаблона в mode = "sibling", одно из которых соответствует элементу commentrangeend и завершает рекурсию, другое обрабатывает промежуточные элементы и завершает рекурсивный вызов <xsl:apply-templates mode="sibling" select="following-sibling::*[1]"/>

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