Любой способ иметь сгенерированное значение счетчика в XSLT? - PullRequest
2 голосов
/ 18 февраля 2010

Есть ли способ использовать XSLT для генерации уникальных идентификаторов (последовательный в порядке), когда их еще нет? У меня есть следующее:

<xsl:template match="Foo">
   <xsl:variable name="varName">
      <xsl:call-template name="getVarName">
         <xsl:with-param name="name" select="@name"/>
      </xsl:call-template>
   </xsl:variable>
   <xsl:value-of select="$varName"/> = <xsl:value-of select="@value"/>
</xsl:template>

<xsl:template name="getVarName">
   <xsl:param name="name" select="''"/>
   <xsl:choose>
      <xsl:when test="string-length($name) > 0">
         <xsl:value-of select="$name"/>
      </xsl:when>
      <xsl:otherwise>
         <xsl:text>someUniqueID</xsl:text> <!-- Stuck here -->
      </xsl:otherwise>
   </xsl:choose>
</xsl:template>

С вводом чего-то вроде:

<Foo name="item1" value="100"/>
<Foo name="item2" value="200"/>
<Foo value="300"/>

Я бы хотел иметь возможность присвоить уникальное значение, чтобы в итоге я получил:

item1 = 100
item2 = 200
unnamed1 = 300

Ответы [ 4 ]

2 голосов
/ 19 февраля 2010

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

<xsl:template match="Foo">
   <xsl:variable name="varName">
      <xsl:call-template name="getVarName" />
   </xsl:variable>
   <xsl:value-of select="$varName"/> = <xsl:value-of select="@value"/>
</xsl:template>

<xsl:template name="getVarName">
   <xsl:choose>
      <xsl:when test="@name != ''">
         <xsl:value-of select="@name"/>
      </xsl:when>
      <xsl:otherwise>
         <!-- position() is sequential and  unique to the batch -->
         <xsl:value-of select="concat('unnamed', position())" />
      </xsl:otherwise>
   </xsl:choose>
</xsl:template>

Может быть, это все, что тебе сейчас нужно. Выходные данные для неназванных узлов не будут строго пронумерованы последовательно (без имени1, без имени2 и т. Д.). Вы получите это:

item1 = 100
item2 = 200
unnamed3 = 300
1 голос
/ 18 февраля 2010

Может быть, добавление собственного постоянного префикса к результату функции generate-id поможет?

0 голосов
/ 18 февраля 2010

Попробуйте что-то вроде этого вместо шаблонов:

<xsl:template match="/DocumentRootElement">
<xsl:for-each select="Foo">
  <xsl:variable name="varName">
    <xsl:choose>
      <xsl:when test="string-length(@name) > 0">
        <xsl:value-of select="@name"/>
      </xsl:when>
      <xsl:otherwise>unnamed<xsl:value-of select="position()"/></xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:value-of select="$varName"/> = <xsl:value-of select="@value"/>\r\n
</xsl:for-each>

0 голосов
/ 18 февраля 2010

Случай 5 из http://www.dpawson.co.uk/xsl/sect2/N4598.html может помочь вам.

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