2017-02-28 50 views
0

我有一個不屬於任何其他複本和修改回答的使用情況。XSLT:複製和修改

我有下面的XML片段:

<Elements> 
    <Irrelevant/> 
    <Item> 
     <Misc. subelements> 
     <Name>A</Name> 
     <Misc. subelements> 
    </Item> 
    <Irrelevant/> 
    <Item> 
     <Misc. subelements> 
     <Name>B</Name> 
     <Misc. subelements> 
    </Item> 
</Elements> 

,並需要將其轉換爲下面的代碼片段(後綴「_x」通過傳遞一個模板參數注入,但答案它可以只是被假定爲總是「_x」):

<Elements> 
    <Irrelevant/> 
    <Item> 
     <Misc. subelements (copied as-is)> 
     <Name>A</Name> 
     <Misc. subelements (copied as-is)> 
    </Item> 
    <Item> 
     <Misc. subelements (copied as-is)> 
     <Name>A_x</Name> 
     <Misc. subelements (copied as-is)> 
    </Item> 
    <Irrelevant/> 
    <Item> 
     <Misc. subelements (copied as-is)> 
     <Name>B</Name> 
     <Misc. subelements (copied as-is)> 
    </Item> 
    <Item> 
     <Misc. subelements (copied as-is)> 
     <Name>B_x</Name> 
     <Misc. subelements (copied as-is)> 
    </Item> 
</Elements> 

即,每個Item以其修改的形式複製一次以其原始形式和一次。我沒有問題,只複製原始形式或只有修正形式,但區分當前上下文是否是被複制的原始或修改是構成挑戰。

+1

你能告訴我們一個XSLT嘗試你有嗎?做'xsl:template match =「Item」> _ x聽起來很直接。或者使用一種模式來處理修改。 –

+0

我忘了提,項目包含了很多,除了名稱等元素,我要複製原樣(不變並沒有明確匹配)的事實。我已經更新的例子,我會嘗試,包括我的XSLT。 – pmf

回答

1

開始與身份轉換模板

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

然後添加一個模板Item元素

<xsl:template match="Item"> 
    <xsl:copy-of select="."/> 
    <xsl:copy> 
    <xsl:apply-templates select="@*"/> 
    <xsl:apply-templates select="node()" mode="change"/> 
    </xsl:copy> 
</xsl:template> 

然後寫一個模板,在模式change

<xsl:template match="Name" mode="change"> 
    <xsl:copy> 
    <xsl:value-of select="concat(., $suffix)"/> 
    </xsl:copy> 
</xsl:template> 

Name元素與全球參數<xsl:param name="suffix" select="'_x'"/>

+0

我已經試過這是動態評估,因爲我是無知的東西像「模式」存在一個額外的參數來模擬模式機制。謝謝! – pmf