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

#xml #xslt

#xml #xslt

Вопрос:

У меня есть 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. что ж, пожалуйста, опубликуйте то, что вы уже пробовали.

Ответ №1:

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

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

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

Еще одна деталь: поскольку вы не знаете точных путей XP к обоим 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>