#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>