XSLT-выберите следующие элементы до определенного тега - PullRequest
4 голосов
/ 08 декабря 2011

Считайте, что у меня есть этот XML-файл:

<text>
  <w>John</w>
  <x>Smith</x>
  <z>Andy</z>
  <w>Goo</w>
  <w>Joseph</w>
  <y>Lee</y>
  <x>Kenny</x>
  <z>Maria</z>
  <y>Zoe</y>
  <z>Martin</z>
</text>

Теперь я хочу выбрать элементы между 1-й <z> и 2-й <z>

Таким образом, вывод будет:

  <w>Goo</w>
  <w>Joseph</w>
  <y>Lee</y>
  <x>Kenny</x>

Что я знаю, так это то, что мы можем «копировать» выбрать «следующие братья и сестры» из «z [1]» но я не знаю, как остановить это на "z [2]"

Ответы [ 2 ]

4 голосов
/ 08 декабря 2011

Выберите пересечение следующих двух наборов узлов:

  • Все узлы после первого z
  • Все узлы перед вторым z

Пересечение этих двух наборов будет всеми узлами между первым и вторым z элементами. Используйте следующее выражение:

/*/z/following-sibling::*[
    count(.|/*/z[2]/preceding-sibling::*) =
    count(/*/z[2]/preceding-sibling::*)]

Примечание : здесь используется формула пересечения множества Кайесса. В общем, используйте следующее, чтобы найти пересечение $set1 и $set2:

$set1[count(.|$set2)=count($set2)]
2 голосов
/ 08 декабря 2011

Вы можете использовать XPath:

text/*[preceding-sibling::z and following-sibling::z[2]]

например:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

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

  <xsl:template match="/">
    <xsl:apply-templates select="text/*[preceding-sibling::z and following-sibling::z[2]]"/>
  </xsl:template>

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