Как сохранить значение переменной и обновить его в XSLT

#xml #xslt

#xml #xslt

Вопрос:

У меня есть атрибут с именем ID, который увеличивается на 1 каждый раз, когда ему присваивается значение.У меня ситуация, когда значение должно увеличиваться при каждом вводе цикла. Внешний цикл содержит 2 записи, а внутренний цикл — 3 записи.

Внешний цикл 1 — Внутренний цикл 1, 2 и 3, атрибут ID увеличивается как 1, 2 и 3, но

Внешний цикл 2 — Внутренний цикл …. снова атрибут ID начинается с 1. Мне нужно, чтобы это было 4, 5 и так далее..

Этот идентификатор приращения не содержит данных, связанных с входным XML-файлом. Вся обработка должна выполняться в XSLT.

Файл XSLT :

 <xsl:variable name="localISYMPid" select="0"/>  
<xsl:element name="Test1">   

    <xsl:for-each select="Solutions/Solution">

        <xsl:if test="Observations/Observation!= ''  ">

            <xsl:for-each select="Observations/Observation">
                <xsl:element name="Roles">

                    <!-- Generating the ID value -->
                    <xsl:variable name="ids" select="generate-id(.)"/>
                    <!-- ***************************-->

                    <xsl:attribute name="CK"><xsl:value-of select="substring-after($ids,'Solution')"/></xsl:attribute>
                    <xsl:attribute name="ID"><xsl:value-of select="position()   $localISYMPid "/></xsl:attribute>
                </xsl:element>
            </xsl:for-each>
        </xsl:if>
    </xsl:for-each>
</xsl:element>
  

Пожалуйста, помогите мне напечатать значение ID 4, поскольку, когда внутренний цикл повторяется 3 раза для внешнего цикла 1 и для внешнего цикла 2, и когда внутренний цикл равен 1, значение ID должно быть 4 . на данный момент он снова печатает 1..

 ID     1
ID     2
ID     3
----------
ID     1(it should print 4)
  

Я использую XSLT 1.0

Спасибо, Ramm

Ответ №1:

Всегда полезно показать свой исходный документ. Но я подозреваю, что вы можете достичь желаемого с помощью чего-то вроде

 <xsl:attribute name="ID">
  <xsl:number level="any" from="Solution"/>
</xsl:attribute>
  

Ответ №2:

Вы используете position() функцию для определения идентификатора, который является локальным для его родительского элемента ( Observation в данном случае). Если вы действительно хотите глобальное значение, то вы могли бы count(preceding::Roles) 1 вместо этого сделать что-то подобное, что подсчитает все Roles узлы, предшествующие текущему, а затем добавит один.

Возможно, вам потребуется немного ограничить preceding::Roles предикат в зависимости от ваших требований, например, preceding::Roles[parent::Observation] чтобы убедиться, что вы учитываете только Roles элементы, которые являются дочерними по отношению к Observation элементу.