Как получить все элементы между двумя маркерами? - PullRequest
0 голосов
/ 26 марта 2019

У меня есть XML, как показано ниже.Я хочу, чтобы все элементы между начальными и конечными самозакрывающимися маркерами.игнорировать остальные элементы.Я пытаюсь сделать это в XSLT.

 <catalog>
 <cd>
    <start/>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
 </cd>
 <end/>
 </catalog>

1 Ответ

0 голосов
/ 26 марта 2019

Идея довольно проста:

  • определить rng1 переменную, содержащую элементы, следующие за start ( после оси),
  • определить rng2переменная, содержащая элементы, предшествующие end ( перед осью),
  • применяет шаблоны к пересечению этих двух наборов элементов.

Но чтобы получить правильно сформированныйПри выводе XML шаблон должен сгенерировать «конверт», например, элемент root, а затем сгенерировать то, что было сказано внутри него.

Еще одна деталь: поскольку вы не знаете точные XPath для обоих start и end код XSLT должен указывать их, начиная с //.

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

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

  <xsl:template match="/">
    <root>
      <xsl:variable name="rng1" select="//start/following::*"/>
      <xsl:variable name="rng2" select="//end/preceding::*"/>
      <xsl:apply-templates select="$rng1 intersect $rng2"/>
    </root>
  </xsl:template>

  <xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
  </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...