2015-06-18 28 views
0

我是XSLT的新手。我有一個XML到XML轉換任務。我必須做的是通過檢查原始xml文件中的一些屬性值來放置xml節點來生成xml樹。XSLT - 通過檢查屬性添加內容

例如:

原始XML已經

<doc> 
<sec id="sec_1" sec-type="scope"> </sec> 
<sec id="sec_1" sec-type="norm-refs"> </sec> 
//more codes 
<doc> 

什麼,我需要做的是,把一些新的XML節點(如例子: <c type="newaddingnode">&#x200B;</c>)在節點結束時向結果XML通過在節點檢查屬性

例如:

sec-type="norm-refs"如果存在是在端o插入新節點f sec-type="scope"。如果此屬性不存在,請在sec-type =「scope」末尾插入新節點。如果兩部分都失蹤了,什麼都不要做。

所以,如果我原來的XML如下,

<doc> 
    <sec id="sec_1" sec-type="scope"> </sec> 
    //more codes 
    <doc> 

我的結果XML應該是這樣的

<doc> 
    <sec id="sec_1" sec-type="scope"> </sec> 
    <c type="newaddingnode">&#x200B;</c> 
    //more codes 
    <doc> 

如果我原來的XML如下,

<doc> 
    <sec id="sec_1" sec-type="norm-refs"> </sec> 
    //more codes 
    <doc> 

我的結果xml應該是這樣的

<doc> 
    <sec id="sec_1" sec-type="norm-refs"> </sec> 
    <c type="newaddingnode">&#x200B;</c> 
    //more codes 
    <doc> 

如果<sec id="sec_1" sec-type="norm-refs"><sec id="sec_1" sec-type="scope">都不存在,則不應添加新節點。還應該添加節點不應該是<sec>的子節點。但它應該添加<sec>節點的結尾。

其他語言這將是相對容易的任務,但我是新來的xslt,所以我想知道我怎麼能在XSLT中做到這一點。我可以使用<xsl:if><xsl:choose>來做到這一點嗎?

+0

我有點困惑,因爲你似乎想插入新的節點(可能,作爲?的最後一個子節點)秒sec-type =「scope」是否sec-type = 「norm-refs」存在。您的需求聲明中是否有拼寫錯誤?顯示一些輸入案例的標本輸出將使它更清晰。 –

+0

@MichaelKay感謝您的評論。我按照你的要求編輯了這個問題。如果你經過它真的很感激。 – sanjay

+0

別擔心。一旦你知道如何,這在XSLT中也相對容易。但是,如果「範圍」和「規範參考」都存在(按任意順序)會發生什麼?新節點應該添加在那裏?謝謝! –

回答

1

嗯,我認爲我們還沒有一個完整的規範,但我會嘗試。我想你已經告訴我們(a)在@ sec_type ='scope'後的任何秒後添加一個新節點。這是

<xsl:template match="sec[@sec_type='scope']"> 
    <xsl:copy-of select="."/> 
    <c type="newaddingnode">&#x200B;</c> 
</xsl:template> 

(b)在@ sec_type ='norm-refs'之後的任何秒後添加一個新節點。這是

<xsl:template match="sec[@sec_type='norm-refs']"> 
    <xsl:copy-of select="."/> 
    <c type="newaddingnode">&#x200B;</c> 
</xsl:template> 

現在,有可能你還沒有告訴我們,就像如果兩者都存在,或者如果他們中的一個出現兩次會發生什麼其他條件。這些條件可以通過改進匹配模式或添加更多規則來處理。

+0

感謝您的評論。:)事情是如果「norm-ref」存在,新節點應該在該節點下。這種情況不涉及「範圍」。如果「norm-ref」不存在且「範圍」存在,則新節點應該放在「範圍」節點下。如果兩者都不存在的話。還有另一種情況。如果「norm-ref」存在多次,則新的節點應該在每個「norm-ref」節點下進行。我主要關心的是如何使用來解決這個問題。如果你能證明如此的指導,我將不勝感激。 – sanjay

+0

我想我的代碼可以完成你所描述的任務。您的「主要問題」應該是解決問題,而不是在解決方案中使用特定的XSLT指令。如果您看到有很多xsl:if和xsl:選擇指令的代碼,它通常是由XSLT中沒有經驗的人編寫的,並且沒有了解到有更好的方法來執行它。 –