Условное приращение в цикле xsl for-each - PullRequest
0 голосов
/ 17 июня 2019

Учитывая следующий формат 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>

Есть ли более правильный способ достижения этого результата?

1 Ответ

1 голос
/ 17 июня 2019

Использование xsl:number:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="id[not(normalize-space())]">
      <xsl:copy>-<xsl:number count="id[not(normalize-space())]"/></xsl:copy>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / ej9EGcU

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...