2012-01-20 5 views
1

Я новичок в XSLT, и я не знаю, как я могу преобразовать это:Как написать атрибут ID на другой узел

<GCInitialStep id="id_A" name="INIT"/> 
    <GCTransition id="id_B" name="T1"/> 
    <GCStep id="id_C" name="A1"/> 
    <!-- ... --> 
    <GCLink fromObject="id_A" toObject="id_B"/> 
    <GCLink fromObject="id_B" toObject="id_C"/> 

К

<InitialStep id="id_A" name="INIT" 
       parentid="" 
       childid="id_B"/> 
    <Transition id="id_B" name="T1" 
       parentid="id_A" 
       childid="id_C"/> 
    <Action id="id_C" name="A1" 
     parentid="id_B" 
     childid=""/> 

возможно ли это? Как?

спасибо :)

+0

Что такое алгоритм? –

+0

Я только что редактировал вопрос, на входе, 'GCLink' связывает объекты по их идентификатору, и я хочу, чтобы это было согласовано в узле, указав parent/child (если есть). –

+0

Вам нужно объяснить требования! Например: Каковы правила для создания элемента «Действие»? Пожалуйста, отредактируйте вопрос и предоставите полный XML-документ (то, что у вас есть сейчас, не является хорошо сформированным документом), точный желаемый результат и хорошее объяснение всех требований, которые должно выполнить преобразование. –

ответ

2

использовать что-то вроде этого:

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

    <xsl:output method="xml" indent="yes" /> 

    <xsl:key name="fromKey" match="GCLink" use="@fromObject"/> 
    <xsl:key name="toKey" match="GCLink" use="@toObject"/> 

    <xsl:template match="/root"> 
     <xsl:copy> 
      <xsl:apply-templates select="*[not(self::GCLink)]"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="*"> 
     <xsl:element name="{substring(name(), 3)}"> 
      <xsl:copy-of select="@id"/> 
      <xsl:copy-of select="@name"/> 
      <xsl:attribute name="parentid"> 
       <xsl:value-of select="key('toKey', @id)/@fromObject"/> 
      </xsl:attribute> 
      <xsl:attribute name="childid"> 
       <xsl:value-of select="key('fromKey', @id)/@toObject"/> 
      </xsl:attribute> 
     </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

применяется к

<root> 
    <GCInitialStep id="id_A" name="INIT"/> 
    <GCTransition id="id_B" name="T1"/> 
    <GCStep id="id_C" name="A1"/> 
    <GCLink fromObject="id_A" toObject="id_B"/> 
    <GCLink fromObject="id_B" toObject="id_C"/> 
</root> 

выходы

<root> 
    <InitialStep id="id_A" name="INIT" parentid="" childid="id_B" /> 
    <Transition id="id_B" name="T1" parentid="id_A" childid="id_C" /> 
    <Step id="id_C" name="A1" parentid="id_B" childid="" /> 
</root> 
+1

Это именно то, чего я хочу, большое спасибо Кирилл! –

+1

@ Арно, добро пожаловать! –

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