2016-05-14 111 views
0

如果這是重複的,我很抱歉,但對XSL知之甚少,所以我未能應用我找到的其他答案。XSL:僅在原始文件包含該標籤時才包含標籤

<node> 
    <xsl:attribute name='TEXT'><xsl:value-of select='@text' /></xsl:attribute> 
    <richcontent TYPE="NOTE"><xsl:value-of select='@_note' /></richcontent> 
</node> 

所以我需要的是創造<richcontent>標籤只有如果原始文檔中存在的@_note元素。如果它不存在,我不想在新文檔中創建<richcontent>標籤。

我懷疑我需要類似「when」的東西,但我不確定如何使用它。當我嘗試以下方法

<node> 
    <xsl:when test='@_note'> 
    <richcontent TYPE="NOTE"><xsl:value-of select='@_note' /> 
    </richcontent> 
    </xsl:when> 
</node> 

我得到這個錯誤

element when is not allowed within that context 
+0

如果您要提供源XML摘錄會很有幫助。 – zx485

+1

** 1。**輸入的一個例子會很有幫助 - 所以會在上下文中看到您的代碼。 - ** 2。**我相信你在這裏濫用了一些術語:'_note'節點似乎是**屬性**,而不是**元素**。而你正在創建的肯定是**元素**,而不是**標籤**。 –

回答

0

毫無@_node元素,因爲這不是一個valid QName,因爲它與「@」字符開始。 QNames只能以:,_,A-Z,a-z或上述鏈接中描述的某些UniCode字符開頭。

<xsl:when>方法來解決是無效的,因爲<xsl:when>只有在<xsl:choose>這樣的情況下有效:

<node> 
    <xsl:choose> 
    <xsl:when test='@_note'> 
     <richcontent TYPE="NOTE"> 
     <xsl:value-of select='@_note' /> 
     </richcontent> 
    </xsl:when> 
    </xsl:choose> 
</node> 

但是,你需要你的元素@_note重命名的東西,符合的QName規範。

+1

精美的作品,謝謝! @_note的事情很清楚。我正在談論具有該屬性的標籤。 –

+0

@MrLMrK:很高興能讀到。如果您錯誤地將'@ _note'命名爲元素而不是屬性 - 可能會發生;-) – zx485

1

您看到的錯誤是由於xsl:when必須是xsl:choose的孩子而引發的。

對您的情況,當您沒有其他xsl:whenxsl:otherwise說明時,您應該使用xsl:if代替。

或者(也許最好),你可以使用一個模板匹配有問題的節點:如果節點不存在,模板將不會被應用,並且新的元素將不會被創建。