使用XSLT创建XML元素而不关闭标记

时间:2011-11-18 12:14:22

标签: 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">
      <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>

这仍然添加了不需要的结束标记。

有人可以帮忙吗?

5 个答案:

答案 0 :(得分:1)

我知道无法强制XSLT使用简写形式。即使有这样的方式,它可能是特定于实现的。事实上,如果我尝试像XMLSpy中的示例,它实际上使用输出的短符号,无论我如何设置xml:space

您可能想要检查可以在正在使用的XSLT处理器上进行哪些设置,以及它是否支持相关的内容。

说实话,我会说如果任何客户端无法建立<element/><element></element>的等价,那么它就不符合XML标准。这是他们的问题,他们应该解决它。

答案 1 :(得分:0)

您是否尝试在<Mapping>(或<xsl:element name="Mapping">)和后续元素后删除所有空格? XSLT引擎可能会将它们视为内容,因此只会打开一个常规元素,以确定没有要写的内容。

<xsl:element name="Mapping"><xsl:attribute name="Source"><xsl:value-of select="@Source" /></xsl:attribute></xsl:element>

答案 2 :(得分:0)

这应该不是一个问题,因为Joe评论。但是,您应该可以加载和规范化生成的XML:

$str = <<<XML
<root>
    <element foo="x" bar="y"></element>
</root>
XML;

$doc = new DomDocument;
$doc->loadXML($str);
echo $doc->saveXML();

输出:

<?xml version="1.0"?>
<root>
    <element foo="x" bar="y"/>
</root>

由于normalizeDocument功能可以触发加载和保存,因此在您的代码中,您可以在完成转换后添加它。

答案 3 :(得分:0)

  

有人可以帮忙吗?

在.NET中, 实现此目的的方法

编写自己的类,源自 XmlWriter ,并覆盖 WriteElementString() 方法的所有必要重载,以便您完全控制元素的序列化。

最后,使用XslCompiledTransform.Transform()作为参数传递您的类的实例。

答案 4 :(得分:0)

空XML元素的序列化方式确实无关紧要,因为任何XML解析器都会将它们视为等效的。但是如果你想以不同的方式完成它,你可以选择一个不同的XSLT处理器。 Saxon可以在.NET上使用,如果你切换,你将获得XSLT 2.0的所有好处以及解决这个小问题。

相关问题