В XSLT вложенный foreach l oop всегда возвращает первый элемент - PullRequest
0 голосов
/ 29 февраля 2020

XLST получает дату от apache -камера в формате ниже.

формат данных

<list>
  <linked-hash-map>
    <entry key="NAME">test1</entry>
  </linked-hash-map>
  <linked-hash-map>
    <entry key="NAME">test2</entry>
  </linked-hash-map>
</list>

Мой XSLT:

<xsl:stylesheet>
  <xsl:template match="*">
      <xsl:for-each select="//*[local-name()='linked-hash-map']">
       <tag1>
            <xsl:value-of select="string(//*[local-name()='entry'][@key='NAME'])"/>
       </tag1t>
      </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

OUTPUT всегда возвращает первый элемент.

<tag1>test1<tag1>
<tag1>test1<tag1>

Что не так в приведенном выше xslt и помогает генерировать xml со всеми элементами.

1 Ответ

1 голос
/ 29 февраля 2020

Поскольку выражения пути, начинающиеся с "//", выбираются из root дерева документа, вы выбираете одни и те же узлы каждый раз в своем xsl:value-of; и в XSLT 1.0, если вы выбираете несколько узлов, отображается только первый.

Метинкс, который вы используете "//", потому что вы видели его в примере кода и фактически не понимаете, что это означает ...

В пределах xsl:for-each обычно требуется относительный путь, который выбирается из узла, обрабатываемого в данный момент для каждого.

Вы также, вероятно, выбрали это *[local-name()='linked-hash-map'] привычка из чужого кода. Без использования пространств имен вы можете безопасно заменить его на linked-hash-map.

...