xslt & xpath: соответствует непосредственно предшествующим комментариям - PullRequest
3 голосов
/ 07 июня 2010

Я пытаюсь применить XSLT-преобразование к пакету XML-документов. Основная задача преобразования - переупорядочить несколько элементов. Я хочу сохранить любые комментарии, которые непосредственно предшествуют элементу:

<!-- not this comment -->
<element />

<!-- this comment -->
<!-- and this one -->
<element />

Самое близкое решение, которое я нашел, - использовать выражение:

<xsl:template match="element">
    <xsl:copy-of select="preceding-sibling::comment()"/>
</xsl:template>

, который захватывает слишком много комментариев:

<!-- not this comment -->
<!-- this comment -->
<!-- and this one -->

Я понимаю, почему вышеупомянутый XPath не работает правильно, но у меня нет хороших идей о том, как действовать. То, что я ищу, - это что-то, чтобы выбрать все предыдущие комментарии, чей следующий родственник является либо другим комментарием, либо текущим обрабатываемым элементом:

preceding-sibling::comment()[following-sibling::reference_to_current_element() or following-sibling::comment()]

Ответы [ 2 ]

5 голосов
/ 07 июня 2010
<xsl:template match="element">
  <xsl:copy-of select="preceding-sibling::comment()[
    generate-id(following-sibling::*[1]) = generate-id(current())
  "/>
</xsl:template>

Более эффективно:

<xsl:key 
  name  = "kPrecedingComment" 
  match = "comment()" 
  use   = "generate-id(following-sibling::*[1])" 
/>

<!-- ... -->

<xsl:template match="element">
  <xsl:copy-of select="key('kPrecedingComment', generate-id())" />
</xsl:template>
1 голос
/ 07 июня 2010

Я думаю, что лучший способ выразить это так:

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

Затем в xpath1.0 / xslt1.0:

<xsl:template match="element">
<xsl:copy-of select="preceding-sibling::comment()[count(following-sibling::*[1]|current()) = 1]"/>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...