XSL:仅当原始文件具有该标记时才包含标记

时间:2016-05-14 17:53:19

标签: xslt

我很抱歉,如果这是重复的,但我对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>标记。

我怀疑我需要“什么时候”之类的东西,但我不确定如何使用它。当我尝试以下

<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

2 个答案:

答案 0 :(得分:1)

您看到的错误会被抛出,因为xsl:when必须是xsl:choose的孩子。

在您的情况下,当您没有其他xsl:whenxsl:otherwise说明时,您应该使用xsl:if代替。

或者(也许最好),您可以使用与相关节点匹配的模板:如果该节点不存在,则不会应用该模板,并且不会创建新元素。

答案 1 :(得分:0)

可能没有@_node元素,因为它不是valid QName,因为它以&#39; @&#39;开头。字符。 QNames只能以:_A-Za-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规范的内容。