C# 使用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"

我需要能够使用XSLT以以下格式创建XML元素:

<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。是的,相当多的方法都被重写,但是在大多数情况下,重写只有几行长。一旦你有了这门课,你可以在任何转换中使用它。这样做需要更多的腿部工作,但比让一线支持团队扔掉订书机和腐烂的东西要痛苦得多