我需要能够使用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>
这仍然添加了不需要的结束标记。
有人可以帮忙吗?
答案 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的所有好处以及解决这个小问题。