如何从一组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    

说明

  1. 一个合理的假设是,在整个生成的文档中,任何具有相同local-name()两个元素属于同一名称空间 – 这涵盖了绝大多数真实XML文档。

  2. 命名空间规范遵循路径规范。 nsmespace规范的格式为:

  3. 在使用xsl:element生成元素之前,使用由xsl:key创建的索引选择适当的命名空间规范。 根据此命名空间规范,其prefixurl属性的值用于在xsl:element指令中指定完整元素名称和元素namespace-uri的值。

有趣的问题。 让我们假设您的XPath表达式输入集满足一些可合理的约束,例如,如果有一个X / article [2]那么还有(在它之前)一个X / article [1]。 让我们暂时将问题的命名空间部分放在一边。

我们来看一个XSLT 2.0解决方案:我们将从表单中的输入开始

  /create/article[1]/id /create/article[1]/description  

然后我们将把它变成

  createarticle[1]id ...  

现在我们将调用一个在第一步进行分组的函数,并递归调用自己进行下一步的分组:

                 

这是未经测试的,可能需要调整细节以使其正常工作。 但我认为基本方法应该有效。

通过预处理路径列表以向每个步骤元素添加命名空间属性,可能最好地解决问题的命名空间部分; 然后可以在xsl:element指令中使用它将元素放在正确的命名空间中。