2011-03-29 32 views
0

我有一個XML的格式一個XML複製到另一個但改變節點屬性和邊緣屬性

<graph id=1> 
    <nodes> 
    <node id =2> 
    <name value=node1/> 
    </node> 
    <node id =3> 
    <name value=node3/> 
    </node> 
    <edges> 
    <edge id=11 source=2 target=3/> 
    </edges> 
</graph> 

現在我想用生成-ID()來更改節點的ID,但應該在所有的改變邊緣也是如此。例如,我將node1的id更改爲'1a1',所以它應該在xml中將邊緣源更改爲'1a1'。 它應該爲所有節點和邊緣執行此操作。其餘的xml應該保持原樣。

我的XSL

<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="@id[parent::node]"> 
    <xsl:attribute name="id"> 
    <xsl:value-of select="generate-id()"/> 
    </xsl:attribute> 
</xsl:template> 

這使節點ID,但我想比較邊緣的源和目標,改變他們。 邊緣源和目標是一些節點ID。

任何幫助將不勝感激。 感謝

回答

1

這個樣式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="kElementById" match="*[@id]" use="@id"/> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="@id"> 
     <xsl:attribute name="id"> 
      <xsl:value-of select="generate-id(..)"/> 
     </xsl:attribute> 
    </xsl:template> 
    <xsl:template match="@source|@target"> 
     <xsl:attribute name="{name()}"> 
      <xsl:value-of select="generate-id(key('kElementById',.))"/> 
     </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 

有了這口井形成輸入:

<graph id="1"> 
    <nodes> 
     <node id ="2"> 
      <name value="node1"/> 
     </node> 
     <node id ="3"> 
      <name value="node3"/> 
     </node> 
     <edges> 
      <edge id="11" source="2" target="3"/> 
     </edges> 
    </nodes> 
</graph> 

輸出:

<graph id="IDAEQBBB"> 
    <nodes> 
     <node id="IDAHQBBB"> 
      <name value="node1"></name> 
     </node> 
     <node id="IDALQBBB"> 
      <name value="node3"></name> 
     </node> 
     <edges> 
      <edge id="IDAQQBBB" source="IDAHQBBB" target="IDALQBBB"></edge> 
     </edges> 
    </nodes> 
</graph> 
+0

謝謝你的幫助,真的很感激。 – Arpita 2011-03-31 13:31:59

+0

@Arpita:不客氣。 – 2011-03-31 13:34:36

+0

謝謝你的幫助,真的很感激it.It的作品,但我不明白你是怎麼做的比較,如果節點ID是假設「11」比它應該取代所有源或目標邊緣屬性與節點ID相同的ID比較。 – Arpita 2011-03-31 13:53:39

0

加入本節,你已經擁有的XSL。

<xsl:template match="@source[parent::edge]|@target[parent::edge]"> 
    <xsl:attribute name="{name()}"> 
     <xsl:value-of select="generate-id(//node[@id=current()]/@id)"/> 
    </xsl:attribute> 
</xsl:template> 
+0

非常感謝您的幫助,真心感謝。 – Arpita 2011-03-31 14:17:18

相關問題