Mono Self Closing标签XslCompiledTransform

时间:2015-03-03 09:11:26

标签: c# xslt mono

我试图确保我的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>
...

1 个答案:

答案 0 :(得分:0)

我的Windows构建创建自关闭标签的原因是它使用了.Net framework 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实现相同。