2012-05-30 2 views
0

У меня есть XSL.Создание инкрементного идентификатора для атрибутов xml с использованием XSLT

<?xml version="1.0" encoding="UTF-8"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
     <xsl:template match="/"> 
      <xsl:element name="root"> 
       <xsl:apply-templates select="ModelDefinition/ContainerSpecNode"/> 
      </xsl:element> 
     </xsl:template> 
     <xsl:template match="ContainerSpecNode"> 
      <xsl:element name="item"> 
       <xsl:attribute name="id"><xsl:value-of select="@specId"/></xsl:attribute> 
       <xsl:attribute name="pathId"><xsl:value-of select="@pathId"/></xsl:attribute> 
       <xsl:attribute name="specId"><xsl:value-of select="@specId"/></xsl:attribute> 
       <xsl:attribute name="rel"><xsl:value-of select="@specType"/></xsl:attribute> 
       <xsl:element name="content"> 
        <xsl:element name="name"> 
         <xsl:value-of select="shortName"/> 
         <xsl:if test="(@minimumCardinalityCount = '0') or (@maximumCardinalityCount != '1')"> [<xsl:value-of select="@minimumCardinalityCount"/>..<xsl:value-of select="@maximumCardinalityCount"/>]</xsl:if> 
        </xsl:element> 
       </xsl:element> 
       <xsl:apply-templates select="propertySpecs/PropertySpecNode"> 
        <xsl:sort select="shortName"/> 
       </xsl:apply-templates> 
      </xsl:element> 
     </xsl:template> 
</xsl:stylesheet> 

Здесь я хочу создать создать инкрементный уникальный номер для ID атрибутов элемента Item для каждого containerSpecNode так же, как «Tree_node_1», «Tree_Node_2» и так далее ... Здесь я изменил код, подобный этому.

. . . . . . 
<xsl:element name="item"> 
<xsl:variable name="count"> 
      <xsl:number/> 
      </xsl:variable> 
      <xsl:attribute name="id"><xsl:value-of select="'Tree_Node_'"/><xsl:value-of select="$count+1"/></xsl:attribute> 

Он увеличивает значение счетчика, но не для всех ContainerSpecNode. Некоторые идентификаторы имеют повторяющееся значение.

Я хочу создать для каждого ContainerSpecNode. Как я могу это сделать. Могу ли я использовать для каждого цикла? и как?

+0

Вы забыли показать нам исходный XML-документ, на котором применяется эта трансформация. Преобразование может быть написано намного короче и читаемо - если бы у нас также был исходный XML. Пожалуйста, отредактируйте вопрос и добавьте эту важную информацию. –

+0

Я добавил свой исходный XML. Пожалуйста, проверьте . –

+0

XML, который был добавлен, нигде не видно ??? –

ответ

2

Вы находитесь рядом с правильным решением.

Просто замените:

<xsl:variable name="count">    
    <xsl:number/>    
</xsl:variable> 

с:

<xsl:variable name="count" select= 
    "count(preceding::ContainerSpecNode | ancestor::ContainerSpecNode) +1"/>    
+0

Мне было интересно, как это будет работать. Попробовали это, но не работали. Изучив мой исходный XML-код, вы можете узнать, что containerSpecNode может иметь дочерний контейнер как containerSpecode, который может иметь дочерний контейнер. –

+0

@RaghuvirSingh: Смотрите мой обновленный ответ. –

+0

Большое спасибо Димитрию за ваш ответ. Это сработало. Поскольку у меня меньше опыта в XSLT, можете ли вы подробнее рассказать о работе предыдущего и предка с оператором OR в вашем ответе. Хотя мои проблемы решаются вашим ответом, я хочу знать, как этот код выполняет работу. –

Смежные вопросы