Количество подэлементов - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь показать XML «2D-список» следующим образом:

<list1>
  <list2>a</list2>
  <list2>b</list2>
  <list2>c</list2>
  <list2>d</list2>
</list1>
<list1>
  <list2>e</list2>
  <list2>f</list2>
  <list2>g</list2>
  <list2>h</list2>
  <list2>i</list2>
  <list2>j</list2>
</list1>

И мне бы хотелось, чтобы это выглядело так:

01 a
02 b
03 c
04 d
05 e
06 f
07 g
08 h
09 i
10 j

Сначала я подумал о том, чтобы иметь переменную xsl: вне двух для каждого и увеличивать ее, но переменные неизменны. Как это можно сделать?

Заранее спасибо

Ответы [ 4 ]

1 голос
/ 13 марта 2019

Я удивлен, что никто не упомянул использование xsl:number. Это то, что я обычно использую, когда мне нумеруют что-то вроде списка.

Пример ...

Ввод XML

<doc>
    <list1>
        <list2>a</list2>
        <list2>b</list2>
        <list2>c</list2>
        <list2>d</list2>
    </list1>
    <list1>
        <list2>e</list2>
        <list2>f</list2>
        <list2>g</list2>
        <list2>h</list2>
        <list2>i</list2>
        <list2>j</list2>
    </list1>
</doc>

XSLT 1.0 (Работает и в других версиях.)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="list2">
    <xsl:number level="any" format="01 "/>
    <xsl:value-of select="concat(.,'&#xA;')"/>
  </xsl:template>

</xsl:stylesheet>

выход

01 a
02 b
03 c
04 d
05 e
06 f
07 g
08 h
09 i
10 j

Скрипка: http://xsltfiddle.liberty -development.net / gWvjQfa / 1

1 голос
/ 13 марта 2019

Еще один возможный способ достижения этого:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />

<xsl:template match="/root">
    <xsl:variable name="items" select="//list1/list2" />

    <xsl:for-each select="list1">
        <xsl:for-each select="list2">

            <xsl:variable name="id" select="generate-id()" />
            <xsl:for-each select="$items">
                <xsl:if test="generate-id() = $id">
                    <xsl:value-of select="position()" />
                    <xsl:value-of select="concat(' ',.)" />
                    <xsl:text>&#10;</xsl:text>
                </xsl:if>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

http://xsltransform.net/eieE3Q8/1

1 голос
/ 13 марта 2019

Здесь не нужно xsl:variable или даже более xsl:for-each (или xsl:apply-templates). Вы можете просто выбрать все элементы list2 одновременно, а затем использовать position() для получения нумерации, поскольку position() основано на положении узла в наборе выбранных узлов, а не на положении в дереве документа.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="text" />

  <xsl:template match="/*">
    <xsl:apply-templates select="list1/list2" />
  </xsl:template>

  <xsl:template match="list2">
    <xsl:value-of select="concat(format-number(position(), '00'), ' ', ., '&#10;')" />
  </xsl:template>
</xsl:stylesheet>

Это предполагает, что ваш XML правильно сформирован, и все элементы list1 находятся в одном родительском элементе.

См. http://xsltfiddle.liberty -development.net / gWvjQf9

0 голосов
/ 13 марта 2019
<xsl:template match="/">
<xsl:apply-templates select="list1/list2"/>
</xsl:template>

<xsl:template match="//list2">
<xsl:value-of select="concat(format-number(position(), '00'), ' ', ., '&#10;')" />
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...