XSL:仅在原始文件包含该标签时才包含标签
如果这是重复的,我很抱歉,但对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
毫无@_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规范。
精美的作品,谢谢! @_note的事情很清楚。我正在谈论具有该属性的标签。 –
@MrLMrK:很高兴能读到。如果您错误地将'@ _note'命名为元素而不是属性 - 可能会发生;-) – zx485
您看到的错误是由于xsl:when
必须是xsl:choose
的孩子而引发的。
对您的情况,当您没有其他xsl:when
或xsl:otherwise
说明时,您应该使用xsl:if
代替。
或者(也许最好),你可以使用一个模板匹配有问题的节点:如果节点不存在,模板将不会被应用,并且新的元素将不会被创建。
如果您要提供源XML摘录会很有帮助。 – zx485
** 1。**输入的一个例子会很有帮助 - 所以会在上下文中看到您的代码。 - ** 2。**我相信你在这里滥用了一些术语:'_note'节点似乎是**属性**,而不是**元素**。而你正在创建的肯定是**元素**,而不是**标签**。 –