2015-10-14 66 views
0

當我執行下面的xsl時,我得到一個截斷的標籤對而不是完整的標籤(參見問題的最後)。用「xsl:value-of select」截斷標籤

原始代碼:

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

<xsl:template match="CONFIG"> 
<xsl:choose> 
    <xsl:when test=" ../ID/.='2'"> 
     <xsl:copy> 
      <xsl:copy-of select="@*"/> 
      <xsl:text>STANDARD</xsl:text> 
     </xsl:copy> 
    </xsl:when> 
</xsl:choose> 
</xsl:template> 
<xsl:template match="NAME"> 
<xsl:choose> 
    <xsl:when test=" ../ID/.='2'"> 
     <xsl:copy> 
      <xsl:copy-of select="@*"/> 
      <xsl:text>DEVELOPMENT</xsl:text> 
     </xsl:copy> 
    </xsl:when> 
</xsl:choose> 
</xsl:template> 

修改後的代碼:

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

<xsl:template match="CONFIG"> 
<xsl:choose> 
    <xsl:when test=" ../ID/.='2'"> 
     <xsl:copy> 
      <xsl:copy-of select="@*"/> 
      <xsl:text>STD</xsl:text> 
     </xsl:copy> 
     <xsl:attribute name="KEY"> 
      <xsl:value-of select='0'/> 
     <xsl:attribute> 
     <xsl:attribute name="NAME"> 
      <xsl:value-of select="'DEVELOPMENT'"/> 
     <xsl:attribute> 
    </xsl:when> 
</xsl:choose> 
</xsl:template> 

這樣的想法,而不是僅僅將CONFIG 「標準」,我也想給SET鍵。 而不是處理相同的「查詢」兩次,我把名稱的設置了。

KEY設置正確;但我得到的截斷 <NAME> 代替
<NAME>DEVELOPMENT</NAME>

我顯然不是一個XML的傢伙,只是在做一些維護。任何線索或建議表示讚賞。

+0

什麼是'node()\ @ *'? – Tomalak

+0

我懷疑反斜槓是'|' –

回答

0

在輸出元素內容後,您無法創建屬性。

移動<xsl:attribute>以上<xsl:text>

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

<xsl:template match="CONFIG[../ID = '2']"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*" /> 
     <xsl:attribute name="KEY">0<xsl:attribute> 
     <xsl:attribute name="NAME">DEVELOPMENT<xsl:attribute> 
     <xsl:text>STD</xsl:text> 
    </xsl:copy> 
</xsl:template> 
+0

的拼寫錯誤,似乎我知道的比我想象的還要小。 我拿起你的話說「不能創建屬性」,這有助於,因爲我沒有試圖創建,那是一個修改。 我真的想要做的是在ID上匹配,並更改ID,CONFIG和NAME。 由於這是維護,我打算踢,只是重複匹配/測試邏輯第三次,這似乎工作。它只是讓我失望,因爲它看起來應該只能匹配一次。 是的,\確實是| (我不能從這個系統剪切和粘貼,所以我必須抄錄)。 感謝您的幫助。 – Cork333

+0

使用''創建屬性會導致覆蓋該名稱的所有現有屬性。實際上,這是一種修改,就像你似乎想要的一樣。 (如果答案已經解決了您的問題,請不要忘記將答案標記爲已接受。) – Tomalak

+0

事實證明它確實有效。問題是我使用的XML編輯器(XMLSpy)有一個內置的引擎並允許MS解析器。出於某種原因,內置解析器不顯示正確的轉換結果。所以它看起來像結束標籤不在那裏,但它是。 6小時地獄;以及一些我不會更新的kludgey代碼。但是,這又是一個信息。 – Cork333