是否可以将属性添加为元素?

时间:2014-07-21 23:42:15

标签: xml

所以我有一些生成XML的遗留代码。问题是它通过打开和关闭标签来操作,并在文件发送时将所有内容写入文件。

startTag("race")
endTag()

会产生:

<race>
</race>

哪一切都很好。除了一些关于种族的相关信息之外,只能在endTag()时推断出。即endTime。我想要生成的XML是:

<race startTime="123" endTime="456>
</race>

但我知道没有重大改写就不可能。我并不感到兴奋。如果在XSLT转换中有相当于使用xsl:attribute的东西,那真的很棒。在哪里我可以得到像这样的XML:

<race startTime="123">
    <attribute name="endTime">
        456
    </attribute>
</race>

这被认为格式正确。

这可能吗?请注意,我无法破解属性要求,因为这必须符合我无法控制的架构。因此,我需要一种方法来使这成为一个适当的&#34;属性。

2 个答案:

答案 0 :(得分:1)

如果有问题的元素是空的,那么它应该不会太难。如果您的代码是Java,您可以轻松地将其转换为使用XMLStreamWriter,它允许像

这样的序列调用
startElement()
attribute()
attribute()
endElement()

它通过延迟输出“&gt;”来处理这个问题在开始标记的末尾,直到它知道所有属性都已到达。但是如果你想要“按顺序”编写内容,那么在属性之前输出元素内容,那么你需要一种非常不同的方法。例如,您可以输出“属性”作为处理指令,然后使用XSLT进行后处理,将处理指令转换为包含元素的属性。

答案 1 :(得分:0)

通常的解决方案确实是重写代码。您没有向我们提供足够的信息,以便向您提供有关容易或困难的建议。通常的解决方案是将属性传递给写出起始标记的方法,或者延迟实际写出起始标记语法,直到你知道不再添加任何属性(这是典型的XSLT序列化程序的方式)工作,所以它可以处理<xsl:attribute>指令。

或者您可以在内存中构建整个文档,这样您就可以轻松返回并重新编辑树的先前构建的部分。

或者你可以通过其他方式解决这个问题。哪一个最有意义取决于你没有告诉我们你的代码试图做什么,它正在使用什么XML库等等所有那些事情。