#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
элементу.