Синтаксический анализ XML с дочерними элементами с одинаковыми именами с использованием XSLT/XSL
Мне интересно, есть ли способ передать через родительский элемент со всеми его дочерними элементами, которые имеют одинаковое имя элемента, используя XSLT.
Например, если оригинальный XML-файл выглядит так:
<parent>
<child>1</child>
<child>2</child>
<child>3</child>
</parent>
И я пытаюсь разобрать его с помощью xsl:
<xsl:for-each select="parent">
<print><xsl:value-of select="child"></print>
желая что-то вроде этого:
<print>1</print>
<print>2</print>
<print>3</print>
но я получаю это:
<print>1</print>
потому что для каждого больше разработан для этого формата:
<parent>
<child>1</child>
<parent>
</parent
<child>2</child>
<parent>
</parent
<child>3</child>
</parent
Есть ли в любом случае получить желаемую распечатку, не форматируя ее, как указано выше, а скорее первым способом?
Спасибо
1 ответ
Это потому, что вы делаете xsl:for-each
на родителя вместо ребенка. Вы получили бы результаты, которые вы ищете, если бы вы изменили его на это (при условии, что текущий контекст /
):
<xsl:for-each select="parent/child">
<print><xsl:value-of select="."/></print>
</xsl:for-each>
Однако... используя xsl:for-each
обычно не нужно. Вы должны позволить переопределить шаблоны обрабатывать работу для вас вместо того, чтобы пытаться добраться до всех детей из одного шаблона / контекста (например, /
)
Вот полная таблица стилей для примера:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="parent">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="child">
<print><xsl:apply-templates/></print>
</xsl:template>
</xsl:stylesheet>
вывод этой таблицы стилей будет:
<print>1</print>
<print>2</print>
<print>3</print>