所以我有一些生成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;属性。
答案 0 :(得分:1)
如果有问题的元素是空的,那么它应该不会太难。如果您的代码是Java,您可以轻松地将其转换为使用XMLStreamWriter,它允许像
这样的序列调用startElement()
attribute()
attribute()
endElement()
它通过延迟输出“&gt;”来处理这个问题在开始标记的末尾,直到它知道所有属性都已到达。但是如果你想要“按顺序”编写内容,那么在属性之前输出元素内容,那么你需要一种非常不同的方法。例如,您可以输出“属性”作为处理指令,然后使用XSLT进行后处理,将处理指令转换为包含元素的属性。
答案 1 :(得分:0)
通常的解决方案确实是重写代码。您没有向我们提供足够的信息,以便向您提供有关容易或困难的建议。通常的解决方案是将属性传递给写出起始标记的方法,或者延迟实际写出起始标记语法,直到你知道不再添加任何属性(这是典型的XSLT序列化程序的方式)工作,所以它可以处理<xsl:attribute>
指令。
或者您可以在内存中构建整个文档,这样您就可以轻松返回并重新编辑树的先前构建的部分。
或者你可以通过其他方式解决这个问题。哪一个最有意义取决于你没有告诉我们你的代码试图做什么,它正在使用什么XML库等等所有那些事情。