2011-11-18 48 views
1

我需要能够使用XSLT创建下列格式的XML元素的结束标记创建XML元素:不使用XSLT

<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> 

这还增加了不必要的结束标记。

任何人都可以帮忙吗?

+1

这两者在语义上是相同的。如果你的客户认为这是一个变化,那么肯定这是他们的问题不是你的问题? – Joe

+0

你可以向我们展示.NET代码进行转换吗?没有XSLT方式来执行某种格式的序列化空元素的格式,例如。 ''或''而不是''所以我很惊讶你说你得到一个带有结束标签的长表单。 –

+0

谷歌搜索给了http://social.msdn.microsoft.com/Forums/en/xmlandnetfx/thread/3f5a3a5f-d088-4664-9216-e4ff8e577a0f。你试过了吗? – Gordon

回答

0

任何人都可以帮忙吗?

In。NET有的方式来实现这一

写自己的类从XmlWriter导出并覆盖WriteElementString()方法的所有必要的过载,让你在序列化的完全控制元素。

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

+0

这样做比较费劲,但比起第一线支持团队向我扔掷订书机和烂蛋的痛苦要少得多 – jaywayco

+0

@jaywayco:我们使用从XmlWriter派生的XhtmlWriter。是的,很多方法都被覆盖,但在大多数情况下覆盖只有几行。一旦你有了这门课,你可以在任何转换中使用它。 –

0

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

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

我知道没有办法迫使XSLT使用简写形式。即使有这种方式,它也可能是针对具体实现的。事实上,如果我尝试使用XMLSpy中的示例,它实际上使用输出的简短表示法,而不管我如何设置xml:space

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

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

+0

有关处理器的好处,我会检查。 – jaywayco

0

这不应该成为一个问题,因为乔评论。您应该能够然而,加载和规范生成的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功能被触发,在你的代码,你可能能够只需在完成转换后添加它即可。

+0

我没有尝试过这个,也没有任何快乐 – jaywayco

+0

你试过了哪个变种?你在使用PHP或.NET XSLT处理器吗? – hakre

+0

我正在使用.NET的一个 – jaywayco

0

真的不应该考虑将哪些方式的空XML元素序列化,因为任何XML解析器都会将它们视为等同的。但是如果你想以不同的方式完成,你可以选择不同的XSLT处理器。 Saxon可以在.NET上使用,如果切换,您将获得XSLT 2.0的所有优势以及解决这个小问题。