2013-05-11 22 views
1

我有XML:添加屬性,該屬性值是另一個人的元素的屬性的值

<graph> 
<node id="a" /> 
<node id="b" /> 
<node id="c" /> 
<node id="d" /> 

<link from="a" id="link1" to="b"/> 
<link from="b" id="link2" to="d"/> 
<link from="d" id="link3" to="c"/> 

</graph> 

我想通過XSLT把它下一個XML:

<graph> 
<node id="a"> 
    <link id="link1" to="b"> 
</node> 
<node id="b"> 
    <link id="link2" to="d"> 
</node><node id="c"> 
<node id="c"/> 
<node id="d"> 
    <link id="link3" to="c"> 
</node> 
</graph> 

我寫XSLT這inlcudes下一部分:

<xsl:template match="//node"> 
    <xsl:element name="link"> 
      <xsl:attribute name="to"> 
       <xsl:value-of select="//link[@from = self::node()/@id]/@to"></xsl:value-of> 
      </xsl:attribute> 
    <xsl:apply-templates />  
    </xsl:element> 


</xsl:template> 

但這沒有奏效。我做錯了什麼?

回答

1

您的XSLT只創建link元素,但您不知何故必須創建和node元素。另外,謂詞中的self::node()不能像您期望的那樣工作。改用current()函數。

要解決您的任務,從身份轉換開始併爲需要特殊處理的節點添加模板是個不錯的主意。下面是一個例子:

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

<xsl:template match="graph"> 
    <xsl:copy> 
     <!-- Only process node children --> 
     <xsl:apply-templates select="node"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="node"> 
    <xsl:copy> 
     <!-- Also process matching links --> 
     <xsl:apply-templates select="@* | //link[@from = current()/@id]"/> 
    </xsl:copy> 
</xsl:template> 

<!-- Don't copy @from attribute of links --> 
<xsl:template match="link/@from"/> 
相關問題