2012-08-06 3 views
0

У меня есть следующие элементы в моем XMi файле:функция Имя в XPATH

<element1 id= 3 > 

<element2 id= 3> 

Я хочу, чтобы превратить их в нечто вроде:

<element1 id= 3 name =element2> 
<element2 id= 3> 

Я использую XSLT для преобразования:

<xsl:if test="@id = //*[@id]/@id"> 
       <xsl:sequence 
        select="fn:createAtt('name',X)" /> 
      </xsl:if> 

Я хочу сравнить идентификатор двух элементов, и в случае, если они совпадают, я хочу сохранить имя второго элемента (elemen t2) в атрибут name первого элемента.

Сравнение работает нормально. Проблема в том, как прочитать имя второго элемента? Я попытался использовать функцию name(), но не смог точно прочитать это имя, которое соответствует сравнению.

+0

Я нашел функцию имени. Я попытался использовать следующий способ: name (// * [@ id = @ id]), и он возвращает значение null, но если я использую имя (// * [@ id = 3]), он возвращает элемент2. Как я могу сделать это автоматически, используя идентификатор имени первого элемента, а не статическое значение? – user1495959

ответ

0

Я хотел бы сделать это следующим образом: сначала определить ключ, как

<xsl:key name="el-by-id" match="*" use="@id"/> 

, то я хотел бы написать такое шаблон

<xsl:template match="*[@id]"> 
    <xsl:variable name="same-id" use="key('el-by-id', @id) except ."/> 
    <xsl:copy> 
    <xsl:copy-of select="@*"/> 
    <xsl:if test="$same-id"> 
     <xsl:attribute name="name" select="node-name($same-id[1])"/> 
    </xsl:if> 
    <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

Таким образом, вы можете эффективно ссылаться на элементы с помощью ключа, а затем, если один элемент одного и того же идентификатора найден, создается атрибут с именем name. Я использовал функцию XSLT/XPath 2.0 node-name, в зависимости от ваших точных требований, которые вы, возможно, захотите использовать вместо <xsl:attribute name="name" select="name($same-id[1])"/>.

+0

Не существует способа просто прочитать второй идентификатор второго элемента и сравнить его внутри функции имени. Это означает, что там, где я использую номер исправления в имени функции (// * [@ id = 3]), чтобы использовать идентификатор второго элемента? Если я смогу это сделать, тогда моя проблема будет решена. спасибо за вашу помощь – user1495959

+0

В зависимости от контекста вам может понадобиться 'name ((// * [@ id = current()/@ id] кроме current()) [1])'. –

+0

Спасибо, МАРТИН :) Проблема решена! Это то, что я искал! – user1495959

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