xslt转换期间自动关闭xml标记

xslt转换期间自动关闭xml标记,xslt,Xslt,我有: <input type="checkbox" name="idsProduct" value="{@id}" id="form_checkbox_product_{@id}"> <xsl:if test="$x=$y"> <xsl:attribute name="checked" >checked</xsl:attribute> </xsl:if> </input>

我有:

<input type="checkbox" name="idsProduct" value="{@id}" 
       id="form_checkbox_product_{@id}">
    <xsl:if test="$x=$y">
        <xsl:attribute name="checked" >checked</xsl:attribute>
    </xsl:if>
</input>

选中的
我得到:

  <input type="checkbox" name="idsProduct" value="26294"
         id="form_checkbox_product_26294" checked="checked"></input>

我想要一个输入标记,如:

<input type="checkbox" name="idsProduct" value="26294" 
       id="form_checkbox_product_26294" checked="checked" />

我的xsl输出是:

 <xsl:output 
      omit-xml-declaration="yes" 
      method="xml"
      encoding="utf-8"
      indent="no" />

如何自动关闭此标记?

尝试删除标记之间的所有空白:

<input type="checkbox" name="idsProduct" value="{@id}" id="form_checkbox_product_{@id}"><xsl:if test="$x=$y"><xsl:attribute name="checked" >checked</xsl:attribute></xsl:if></input>
已选中

这行得通吗?

这与这个问题类似(尽管你的问题是正反方向的):

这里有一个“技巧”的讨论,它会导致使用闭合元素的较长形式,您似乎无意中使用了它,形式略有不同。我怀疑您的问题是因为您要求xslt直接输出到文本。首先输出到xml文档,然后序列化,这应该可以解决您的问题

这里有一个扩展方法,我用它来转换成
XmlDocument
而不是字符串,然后只要读取的
.OuterXml
属性,就可以得到字符串等价物;因为XSLT没有输出到文本,所以它应该正确处理关闭的标记

    public static XmlDocument Transform(this XmlDocument input, XslCompiledTransform xslt)
    {
        XmlDocument outDoc = new XmlDocument(input.CreateNavigator().NameTable);
        using (XmlWriter xr = outDoc.CreateNavigator().AppendChild())
        {
            xslt.Transform(input, xr);
        }

        return outDoc;
    }

您使用的是什么XSLT处理器?Xalan、MSXML、.Net、libxslt?…为什么需要这些?在XML中,实际上相当于。如果您需要它用于HTML,那么您应该在
标记中使用
method=“HTML”
。@Martijn用于w3c验证“xhtml”而不是HTML。这就是为什么输出是xmlI,我不希望它工作。XSLT样式表中的空白将被忽略,除非它出现在xsl:text中。@flyn1179:对此非常清楚:对于样式表,保留空白的元素名称集只包括样式表中的
xsl:text
@flynn179:literal结果元素,如
foo
,并且样式表的仅带空白的文本节点规则确实适用于它们。@flynn179:对于某些XSLT处理器,您的意思是什么?只有此规则的样式表将在Xalan、Oracle、Saxon、Altova、XQSharp和MSXSL 3/4中输出
。。。