Mono Self Closing 标签 XslCompiledTransform

Mono Self Closing tags XslCompiledTransform

我试图确保我的 XSL 转换始终生成自闭合标记,即:

<item attribute="value" />

没有

<item attribute="value"></item>

网上有很多帖子说人们在试图得到与我想要的相反的东西时遇到困难。

这似乎在我的 windows 构建上运行良好,但我 运行 我的程序在 Wheezy 上的 Mono 2.10.8.1 中似乎总是产生第二个不受欢迎的选项。

    XmlWriterSettings xmlSettings = new XmlWriterSettings();
    xmlSettings.Indent = true;
    xmlSettings.NewLineChars = "\n";
    xmlSettings.OmitXmlDeclaration = true;

    XmlReader reader = XmlReader.Create(new StringReader(xml));

    using (XmlWriter writer = XmlWriter.Create(outputStream, xmlSettings))
    {
         m_SoapXSLT.Transform(reader, writer);
    }

    string outStr = outputStream.ToString();

有没有人知道如果我可以做些什么来确保我想要的行为,为什么他们会有所不同?

以下是 XSL 文档的一些摘录:

<?xml version="1.0" encoding="UTF-8" ?>

<xsl:stylesheet version="3.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:xdt="http://www.w3.org/2005/xpath-datatypes"
xmlns:err="http://www.w3.org/2005/xqt-errors"
exclude-result-prefixes="xs xdt err fn">

<xsl:output method="xml" indent="yes"  omit-xml-declaration="yes"/>

...
<xsl:if test="self::node()[@type='46']">
    <xsl:element name="elementName">
        <xsl:attribute name="NumItems">
            <xsl:value-of select="count(self::node()/selections/selection)"/>
            </xsl:attribute>
            <xsl:for-each select="self::node()/items/item">
                <xsl:element name="item">
                    <xsl:attribute name="A">
                        <xsl:value-of select="@data1"/>
                    </xsl:attribute>
                    <xsl:attribute name="B">
                        <xsl:value-of select="@data2"/>
                    </xsl:attribute>
                    <xsl:attribute name="Num">
                        <xsl:value-of select="position()"/>
                    </xsl:attribute>
                </xsl:element>
            </xsl:for-each>
        </xsl:element>
    </xsl:if>
...

我的 windows 构建创建自闭标签的原因是它使用的是来自 .Net 框架 v2.0.50727 的 System.XML.dll 而 Mono 使用的是更倾向于创建的不同版本完整的结束标签。

为了获得所需的行为,我必须将以下两个 dll 从我的 .net 框架复制到我的可执行文件的本地目录中:

System.XML.dll 和 System.Data.SqlXml.dll

请注意,我必须将 System.XML.dll 重命名为 System.Xml.dll让 Mono 获取并接受 dll。

完成后,我的 Xml 输出与我的 windows 实施相同。