2016-05-14 75 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代替。

或者(也许最好),你可以使用一个模板匹配有问题的节点:如果节点不存在,模板将不会被应用,并且新的元素将不会被创建。