2016-05-03 93 views
1

我有下面的XML文件:與另一個標籤更換標籤根據其屬性值

<p> 
    <rs key="rGR" n="1" id="id1">XXXXX</rs> 
    <rs key="rGR" n="2" xml:id="id3">YYYYYY</rs>, text text texts 
    <rs key="rGR" n="3" xml:id="id4">ZZZZZZ</rs>) text text text. 
    <rs key="r3" n="1" xml:id="id30">HHHHHH</rs>text text text text text. 
text text 
    <rs key="r3" n="2" xml:id="id31">KKKKKK</rs> 
    <rs key="r3" n="3" xml:id="id32">PPPPPPP</rs> text text text 
</p> 

我想用標籤<ref>更換標籤rs[@n="1"],只保留@id和其他<rs>n != 1 。這應該有一些關鍵,因爲我想用標籤<ptr>替換它,該標籤的屬性指針包含<rs>@idn=1

輸出應該是這樣的:

<p> 
    <ref id="id1">XXXXX</ref>(text text 
    <ptr pointer="id1">YYYYYY</ptr>, text text text 
    <ptr pointer="id1">ZZZZZZ</ptr>) text text text 
    <ref id="id30">HHHHHH</ref> 
text text text text text. 
text text 
    <ptr pointer="id30">KKKKKK</ptr> 
    <ptr pointer="id30">PPPPPPP</ptr> text text text 
    </ref> 
</p> 

我用下面的語法,但它僅適用,如果n=1

<xsl:template match="rs[@n='1']"> 
    <ref id="{@xml:id}"> 
    <xsl:apply-templates/> 
    </ref> 
</xsl:template> 

回答

1

它看起來像你只需要添加第二個模板匹配案件wheh n != 1

<xsl:template match="rs[@n != '1']"> 

事實上,你可以只是寫這一點,因爲它具有較低的優先級與條件的一個

<xsl:template match="rs"> 

在這裏面,你可以用n = 1得到rsxml:id像這樣

<ptr pointer="{../rs[@key=current()/@key and @n=1]/@xml:id}"> 

試試這個XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="rs[@n='1']"> 
    <ref id="{@xml:id}"> 
     <xsl:apply-templates/> 
    </ref> 
    </xsl:template> 

    <xsl:template match="rs"> 
    <ptr pointer="{../rs[@key=current()/@key and @n='1']/@xml:id}"> 
     <xsl:apply-templates/> 
    </ptr> 
    </xsl:template> 

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

如果你有@id@xml:id屬性的組合,試試這個來代替:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="rs[@n='1']"> 
    <ref id="{@*[local-name() = 'id']}"> 
     <xsl:apply-templates/> 
    </ref> 
    </xsl:template> 

    <xsl:template match="rs"> 
    <ptr pointer="{../rs[@key=current()/@key and @n='1']/@*[local-name() = 'id']}"> 
     <xsl:apply-templates/> 
    </ptr> 
    </xsl:template> 

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

謝謝@Tim的回答,標籤被放置在正確的地方,但對於標籤RS [@鍵=「RGR」] id的值不會在這兩個標籤存在。 – AbirH

+0

第二種解決方案效果很好,非常感謝您的幫助! – AbirH

+0

我認爲當標籤無序時會有問題,例如,當我們有這個問題時: XXXXX HHHHHH YYYYYY rs [@ id =「id3」]將採取rs [@ id =「id30」]的編號 – AbirH

相關問題