我试图确保我的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>
...
答案 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实现相同。