Синтаксический анализ XML с дочерними элементами с одинаковыми именами с использованием XSLT / XSL - PullRequest
3 голосов
/ 07 июля 2011

Мне интересно, есть ли способ передачи через родительский элемент со всеми его дочерними элементами, которые имеют одинаковое имя элемента, с использованием 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>

, потому что for-each больше подходит для этого формата:

<parent>
  <child>1</child>
<parent>
</parent
  <child>2</child>
<parent>
</parent
  <child>3</child>
</parent

Есть ли способ получить желаемую распечатку, не отформатировав ее, как указано выше, а скорее первым способом?

Спасибо

1 Ответ

5 голосов
/ 07 июля 2011

Это потому, что вы делаете 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>
...