Проблема с циклом xsl xml - PullRequest
1 голос
/ 28 июня 2011

У меня есть этот XML с 3 узлами с тем же именем <person>. Проблема в том, что 2 из них находятся под одним родительским узлом <people>, а другой - под другим <people> узлом, поэтому, когда цикл Xsl проходит, он получает только первый 2.

Xml:

<data>
  <people>
    <person></person>
    <person></person>
  </people>
  <people>
    <person></person>
  </people>
</data>

Xsl loop:

<xsl:for-each select="//person">

Кто-нибудь знает, что мне нужно сделать, чтобы увидеть все 3 из них?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 28 июня 2011

Использование может использовать этот шаблон с xsl:for-each:

<xsl:template match="data">
    <root>
        <xsl:for-each select="//person">
            <item>
                <xsl:value-of select="name(.)"/>
            </item>
        </xsl:for-each>
    </root>
</xsl:template>
1 голос
/ 28 июня 2011

XPath:

//person

выбирает все персональные элементы независимо от того, где они находятся во входных данных XML (см. здесь ).

Инструкция XSLT:

<xsl:for-each select="//person">

Итерирует по всем элементам персонажа, выбранным этим XPath.В каком бы контексте вы ни использовали эту инструкцию, преобразование должно повторяться для всех трех элементов.Это не так в ситуациях, подобных (с учетом примера ввода, приведенного в вашем вопросе):

<xsl:template match="/data/people[1]">
    <xsl:for-each select=".//person">
        <xsl:value-of select="name(.)"/>
    </xsl:for-each>
</xsl:template>

, где вы явно выбираете все элементы персонажа, начиная с определенного контекста.В таком случае, и я думаю, что только в таком случае вы будете повторять только первые два элемента.

Поэтому в ваших тестах есть что-то странное.

1 голос
/ 28 июня 2011

Вместо xsl-foreach лучшим подходом будет использование шаблона, который соответствует узлам человека:

<xsl:template match="/">
  <!-- match any person element that is a descendant of the root -->
  <xsl:apply-templates select="//person"/>
</xsl:template>

<xsl:template match="person">
   <!-- transform the person element here -->
</xsl:template match="person">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...