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

时间:2011-02-18 09:40:53

标签: 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="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" />

如何自动关闭此标记?

2 个答案:

答案 0 :(得分:1)

这类似于这个问题(虽然你的问题是直接反向):

Using xsl:if doesn't include closing tag

这里讨论了一个'技巧',导致使用更长形式的封闭元素,你似乎无意中在这里使用了一个稍微不同的形式。我怀疑你的问题是因为你要求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;
    }

答案 1 :(得分:0)

尝试从标记之间删除所有空格:

<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>

这有用吗?