在包含元素的子元素之后,无法创建属性节点(已选中)

时间:2016-01-07 10:49:15

标签: xml xslt

以下代码仅在我删除所有new lines时才有效。

这不起作用:

<input type="radio">
    <xsl:if test="@selected = 'true'" >
        <xsl:attribute name="checked">
            <xsl:value-of select="@selected" />
        </xsl:attribute>
    </xsl:if>
</input>

这有效:

<input type="radio"><xsl:if test="@selected = 'true'" ><xsl:attribute name="checked"><xsl:value-of select="@selected" /></xsl:attribute></xsl:if></input>

此代码也有效,但它并不是更好:

<input type="radio"
    ><xsl:if test="@selected = 'true'" 
        ><xsl:attribute name="checked"
            ><xsl:value-of select="@selected" 
        /></xsl:attribute
    ></xsl:if
></input>

如何使xslt文件可读并保持代码正常工作?

1 个答案:

答案 0 :(得分:2)

我会将我的评论扩展为答案,因此它可以帮助其他人......

根据W3C specification about Whitespace stripping文本节点从XSLT中剥离,除非以下之一为真

  • 文本节点的父节点的元素名称在集合中 保留空格的元素名称。
  • 文本节点至少包含 一个非空白字符。与XML一样,空白字符也是如此 #x20#x9#xD#xA
  • 文本节点的祖先元素具有xml:space属性,其值为preserve,并且没有更近的祖先元素具有xml:space,其值为default。

在您的情况下,父节点上的xml:space="preserve"input。这意味着用于缩进XSLT的空白节点实际上被复制到输出而不是从XSLT中删除。但是,如果要向父元素添加属性,则必须在将任何子节点(包括文本节点)添加到父节点之前执行此操作(请参阅http://www.w3.org/TR/xslt#creating-attributes)。

解决方案就是删除xml:space,或者不将其设置为“保留”。