如何从一组XPath表达式生成XML文件?
我希望能够在给定一组XPath映射的情况下生成完整的XML文件。
输入可以在两个映射中指定:(1)一个列出XPath表达式和值; (2)定义适当名称空间的另一个。
/create/article[1]/id => 1 /create/article[1]/description => bar /create/article[1]/name[1] => foo /create/article[1]/price[1]/amount => 00.00 /create/article[1]/price[1]/currency => USD /create/article[2]/id => 2 /create/article[2]/description => some name /create/article[2]/name[1] => some description /create/article[2]/price[1]/amount => 00.01 /create/article[2]/price[1]/currency => USD
对于名称空间:
/create => xmlns:ns1='http://predic8.com/wsdl/material/ArticleService/1/ /create/article => xmlns:ns1='http://predic8.com/material/1/' /create/article/price => xmlns:ns1='http://predic8.com/common/1/' /create/article/id => xmlns:ns1='http://predic8.com/material/1/'
另请注意,我也必须处理XPath 属性表达式。 例如:我还应该能够处理属性,例如:
/create/article/@type => richtext
最终的输出应该是这样的:
foo bar 00.00 USD 1 some name some description 00.01 USD 2
PS:对于上一个问题,这是一个更详细的问题,尽管由于一系列进一步的要求和澄清,我被建议提出一个更广泛的问题,以满足我的需求。
另请注意,我在Java中实现了这一点。 因此,基于Java或基于XSLT的解决方案都是完全可以接受的。 日Thnx。
进一步说明:我真的在寻找通用的解决方案。 上面显示的XML只是一个例子。
如果建立在前一个问题的解决方案的基础上,这个问题很容易解决:
- richtext
- en-us
- 1
- bar
- foo
- 00.00
- USD
- 11.11
- AUD
- 2
- some name
- some description
- 00.01
- USD
当此转换应用于任何XML文档(未使用)时,将生成所需的正确结果 :
1 bar foo 00.00 USD 11.11 AUD 2 some name some description 00.01 USD
说明 :
-
一个合理的假设是,在整个生成的文档中,任何具有相同
local-name()
两个元素属于同一名称空间 – 这涵盖了绝大多数真实XML文档。 -
命名空间规范遵循路径规范。 nsmespace规范的格式为:
-
在使用
xsl:element
生成元素之前,使用由xsl:key
创建的索引选择适当的命名空间规范。 根据此命名空间规范,其prefix
和url
属性的值用于在xsl:element
指令中指定完整元素名称和元素namespace-uri的值。
有趣的问题。 让我们假设您的XPath表达式输入集满足一些可合理的约束,例如,如果有一个X / article [2]那么还有(在它之前)一个X / article [1]。 让我们暂时将问题的命名空间部分放在一边。
我们来看一个XSLT 2.0解决方案:我们将从表单中的输入开始
/create/article[1]/id /create/article[1]/description
然后我们将把它变成
create article[1] id ...
现在我们将调用一个在第一步进行分组的函数,并递归调用自己进行下一步的分组:
这是未经测试的,可能需要调整细节以使其正常工作。 但我认为基本方法应该有效。
通过预处理路径列表以向每个步骤元素添加命名空间属性,可能最好地解决问题的命名空间部分; 然后可以在xsl:element指令中使用它将元素放在正确的命名空间中。