C# 使用XSLT创建不带结束标记的XML元素
我需要能够使用XSLT以以下格式创建XML元素:C# 使用XSLT创建不带结束标记的XML元素,c#,php,asp.net,xml,xslt,C#,Php,Asp.net,Xml,Xslt,我需要能够使用XSLT以以下格式创建XML元素: <element foo="x" bar="y" /> 我似乎仅限于: <element foo="x" bar="y"></element> 原因是我们有一个流程更改,但与客户端的接口不能更改。您可能会认为它们本质上是相等的,您是对的,但我们不能假设我们的客户使用的是合理的XML解析技术 我试过: <Mapping> <xsl:attribute name="Source"
<element foo="x" bar="y" />
我似乎仅限于:
<element foo="x" bar="y"></element>
原因是我们有一个流程更改,但与客户端的接口不能更改。您可能会认为它们本质上是相等的,您是对的,但我们不能假设我们的客户使用的是合理的XML解析技术
我试过:
<Mapping>
<xsl:attribute name="Source">
<xsl:value-of select="@Source"/>
</xsl:attribute>
<xsl:attribute name="Destination">
<xsl:value-of select="@Destination"/>
</xsl:attribute>
</Mapping>
这显然会添加不需要的结束标记,并且:
<xsl:element name="Mapping">
<xsl:attribute name="Source">
<xsl:value-of select="@Source"/>
</xsl:attribute>
<xsl:attribute name="Destination">
<xsl:value-of select="@Destination"/>
</xsl:attribute>
</xsl:element>
这仍然添加了不需要的结束标记
有人能帮忙吗?您是否尝试过删除
(或
)和后续元素之后的所有空格?XSLT引擎可能会将它们视为内容,从而打开一个常规元素,以便发现没有任何东西可以写入。
<xsl:element name="Mapping"><xsl:attribute name="Source"><xsl:value-of select="@Source" /></xsl:attribute></xsl:element>
您是否尝试过删除
(或
)和后续元素之后的所有空格?XSLT引擎可能会将它们视为内容,从而打开一个常规元素,以便发现没有任何东西可以写入。
<xsl:element name="Mapping"><xsl:attribute name="Source"><xsl:value-of select="@Source" /></xsl:attribute></xsl:element>
我知道没有办法强迫XSLT使用简写形式。即使有这样一种方法,它也可能是特定于实现的。事实上,如果我在XMLSpy中尝试类似于您的示例的东西,它实际上使用了输出的简短符号,而不管我如何设置
xml:space
您可能需要检查在所使用的XSLT处理器上可以进行哪些设置,以及它是否支持相关内容
老实说,我想说,如果任何客户机都无法建立
和
的等价性,那么它就不符合XML,甚至不能被破坏。这是他们的问题,他们应该解决它。我知道没有办法强迫XSLT使用简写形式。即使有这样一种方法,它也可能是特定于实现的。事实上,如果我在XMLSpy中尝试类似于您的示例的东西,它实际上使用了输出的简短符号,而不管我如何设置xml:space
您可能需要检查在所使用的XSLT处理器上可以进行哪些设置,以及它是否支持相关内容
老实说,我想说,如果任何客户机都无法建立
和
的等价性,那么它就不符合XML,甚至不能被破坏。这是他们的问题,他们应该解决。正如Joe所说,这根本不是问题。但是,您应该能够加载并规范化生成的XML:
$str = <<<XML
<root>
<element foo="x" bar="y"></element>
</root>
XML;
$doc = new DomDocument;
$doc->loadXML($str);
echo $doc->saveXML();
$str=正如Joe评论的那样,这应该不是一个问题。但是,您应该能够加载并规范化生成的XML:
$str = <<<XML
<root>
<element foo="x" bar="y"></element>
</root>
XML;
$doc = new DomDocument;
$doc->loadXML($str);
echo $doc->saveXML();
$str=
有人能帮忙吗
在.NET中是实现这一点的方法:
编写自己从派生的类,并覆盖方法的所有必要重载,以便完全控制元素的序列化
最后,将传递参数用作类的实例
有人能帮忙吗
在.NET中是实现这一点的方法:
编写自己从派生的类,并覆盖方法的所有必要重载,以便完全控制元素的序列化
最后,将传递作为类实例的参数。空XML元素的序列化方式并不重要,因为任何XML解析器都会将它们视为等价的。但是,如果希望以不同的方式完成,可以选择不同的XSLT处理器。Saxon在.NET上可用,如果您切换,您将获得XSLT 2.0的所有好处,并解决这个小问题。空XML元素的序列化方式其实并不重要,因为任何XML解析器都会将它们视为等价的。但是,如果希望以不同的方式完成,可以选择不同的XSLT处理器。Saxon在.NET上可用,如果您切换,您将获得XSLT 2.0的所有好处,并解决这个小问题。两者在语义上是相同的。如果你的客户认为这是一种改变,那么这肯定是他们的问题,而不是你的问题。你能给我们看一下进行转换的.NET代码吗?XSLT无法强制执行某种格式来序列化空元素,例如
或谷歌搜索。你试过了吗?只要客户认为这些不同,那就是我们的问题。有多个付费客户都有自己的实现——从技术上讲,有些不是最好的实现方式,但对他们有效。这是一天结束时的事情,在对正确解析XML的方法发表任何意见之前,金钱会说话。这两者在语义上是相同的。如果你的客户认为这是一种改变,那么这肯定是他们的问题,而不是你的问题。你能给我们看一下进行转换的.NET代码吗?XSLT无法强制执行某种格式来序列化空元素,例如
或谷歌搜索。你试过了吗?只要客户认为这些不同,那就是我们的问题。有多个付费客户都有自己的实现——从技术上讲,有些不是最好的实现方式,但对他们有效。这是一天结束时的事情,在对正确的解析XML的方法发表任何意见之前,金钱会进行谈判。这样做需要更多的腿部工作,但比让一线支持团队向他们扔订书机和臭鸡蛋要痛苦得多me@jaywayco:我们正在使用从XmlWriter派生的XhtmlWriter。是的,相当多的方法都被重写,但是在大多数情况下,重写只有几行长。一旦你有了这门课,你可以在任何转换中使用它。这样做需要更多的腿部工作,但比让一线支持团队扔掉订书机和腐烂的东西要痛苦得多