XSL числовой генерировать-id () - PullRequest
6 голосов
/ 21 апреля 2010

Как XSL может генерировать уникальный атрибут id для каждого элемента в документе XML, используя XSL, где идентификатор должен быть числовым? XLS ниже работает, за исключением того, что сгенерированные идентификаторы являются буквенно-цифровыми, и мне нужен числовой?

<?xml version='1.0' encoding='utf-8'?>  
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
    xmlns:msxsl='urn:schemas-microsoft-com:xslt' exclude-result-prefixes='msxsl'>  
    <xsl:output method='xml' indent='yes'/>  
    <xsl:template match='*'>  
      <xsl:copy>  
        <xsl:attribute name='ElementID'>  
          <xsl:value-of select='generate-id()'/>  
        </xsl:attribute>  
        <xsl:apply-templates/>  
      </xsl:copy>  
    </xsl:template>    
</xsl:stylesheet>  

Спасибо.

Ответы [ 2 ]

7 голосов
/ 22 апреля 2010

Вы всегда можете использовать :

     concat(count(ancestor::node()),
           '00000000',
           count(preceding::node()))

Знающие люди, такие как Майкл Кей, предупреждают, что <xsl:number/> неэффективно (иногда O (N ^ 2)) и следует избегать, если это возможно.

3 голосов
/ 21 апреля 2010

Переключение с использованием числа () с уровнем и счетом, кажется, добилось цели.

Спасибо

<?xml version='1.0' encoding='utf-8'?>
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
    xmlns:msxsl='urn:schemas-microsoft-com:xslt' exclude-result-prefixes='msxsl'>
    <xsl:output method='xml' indent='yes'/>
    <xsl:template match='*'>
      <xsl:copy>
        <xsl:attribute name='ElementID'>
          <xsl:number level='any' count='*' />
        </xsl:attribute>
        <xsl:copy-of select="@*"/><!--copy of existing all attributes-->
        <xsl:apply-templates/>
      </xsl:copy>
    </xsl:template>  
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...