Учитывая следующий формат XML:
<?xml version="1.0"?>
<items>
<id>7</id>
<id></id>
<id/>
<id>9</id>
<id/>
</items>
Я бы хотел автоматически уменьшать каждый заданный "идентификатор", в идеале, используя XSLT версии 1.0.
Из-за неизменностиПеременные в XSL, я мог бы только придумать следующее решение:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<items>
<xsl:for-each select="items/id[text()]">
<id><xsl:value-of select="."/></id>
</xsl:for-each>
<xsl:for-each select="items/id[not(text())]">
<id><xsl:value-of select="-position()"/></id>
</xsl:for-each>
</items>
</xsl:template>
</xsl:stylesheet>
Но это нарушает порядок элементов.Я бы предпочел этот результирующий xml:
<?xml version="1.0"?>
<items>
<id>7</id>
<id>-1</id>
<id>-2</id>
<id>9</id>
<id>-3</id>
</items>
Есть ли более правильный способ достижения этого результата?