2017-06-18 61 views
0

我正在嘗試做一些可能非常簡單的事情,但我非常基本的xslt並不適合它。 考慮下面的XML:XSLT - 比較節點值和傳遞屬性(如果節點相等的話)

<?xml version="1.0" encoding="UTF-8"?> 
<MyLists> 
    <List1> 
     <Place01 ctr="PTG">Lisbon</Place01> 
     <Place02 ctr="SPA">Madrid</Place02> 
     <Place03 ctr="FRA">Paris</Place03> 
     <Place04 ctr="ENG">York</Place04> 
    </List1> 
    <List2> 
     <Item01 type="country">Italy</Item01> 
     <Item02 type="person">John</Item02> 
     <Item03 type="city">York</Item03> 
     <Item04 type="city" subtype="capital">Madrid</Item04> 
    </List2> 
</MyLists> 

我想文本節點從<List1><List2>比較,而且,只要他們的價值觀是相同的,從<List2>傳遞,每個元素,屬性到相應的項目<List1>,爲了得到:

<?xml version="1.0" encoding="UTF-8"?> 
<MyLists> 
    <List1> 
     <Place01 ctr="PTG">Lisbon</Place01> 
     <Place02 ctr="SPA" type="city" subtype="capital">Madrid</Place02> 
     <Place03 ctr="FRA">Paris</Place03> 
     <Place04 ctr="ENG" type="city">York</Place04> 
    </List1> 
    <List2> 
     <Item01 type="country">Italy</Item01> 
     <Item02 type="person">John</Item02> 
     <Item03 type="city">York</Item03> 
     <Item04 type="city" subtype="capital">Madrid</Item04> 
    </List2> 
</MyLists> 

理想情況下,我希望能夠複製屬性爲準這些元素具備,而無需指定它們。

非常感謝提前!

回答

0

如果我理解這個正確的,你可以這樣做:

XSLT 1.0

<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:strip-space elements="*"/> 

<xsl:key name="match" match="Item" use="." /> 

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

<xsl:template match="Place"> 
    <xsl:copy> 
     <xsl:copy-of select="key('match', .)/@*"/> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
+0

我應該指定,我想能夠複製和只添加屬性,爲了保留第一個列表中可能存在的屬性,以及元素的名稱。我已經編輯了相應的原始示例。非常感謝! – Robin

+0

@Robin如果您想複製現有屬性,請在''/@ *「/>'。注意,同名的屬性將被覆蓋。 –

+0

它可以工作,非常感謝! – Robin

相關問題