我想允许用户将包含交易信息的文件上传到我的应用程序。我希望用户能够在执行此操作时使用自己的文件格式(XML或CSV)。
因此,在进行进一步处理之前,我需要从格式转换为格式。我不想每次用户都有新的文件格式时手动创建这个XSLT,所以我想创建一个基本上构建这个XSLT文档的UI。
对于CSV文件格式,这相对容易。用户说第一个元素映射到我身边的x字段,第二个元素映射到7字段等。
当文件格式是带有嵌套元素的XML等时,这会变得更复杂。有没有人知道这样做的好UI范例?我可以在网上或其他地方看到的任何例子?我想用户必须将完整的xpath描述为映射的一部分,或者首先上传一个XSD并使用它来选择映射的元素(之后我需要生成XSLT)。
我很感激任何想法。
答案 0 :(得分:1)
如果输入XML可以直接映射到XML格式,那么用户就需要一组XPath表达式。
“直截了当”是指一种非常基本的<xsl:apply-templates>
方法。输入XML必须具有可以明确地处理的单个记录,包含正确格式的所有数据。没有数据需要计算或其他特殊处理,比评估单个XPath表达式所能达到的要复杂得多。
如果输入为:
<root>
<entry id="1" name"foo">
<data1>somevalue
<data2>othervalue</data2>
</data1>
</entry>
</root>
,你想要的输出是:
<records>
<record>
<id>1</id>
<name>foo</name>
<data1>somevalue</data1>
<data2>othervalue</data2>
</record>
</records>
然后用户必须提供以下映射:
并且XSLT将是这样的(“%”中的值将被上述映射配置中的实际XPath表达式替换):
<xsl:template match="/">
<records>
<xsl:apply-templates select="%root element%/%record element%" />
</records>
</xsl:template>
<xsl:template match="%root element%/%record element%">
<record>
<id>
<xsl:value-of select="%id-xpath%[1]" />
</id>
<name>
<xsl:value-of select="%name-xpath%[1]" />
</name>
<!-- and so on -->
</record>
</xsl:template>
答案 1 :(得分:0)
如果我理解正确,您正在考虑创建所需xslt所需的UI。我假设这是一个基于Web的应用程序。一种方法是使用xslt将输入xml呈现为html(我倾向于使用的是xmlverbatim)。您可以修改此xslt以创建指向节点的链接。此外,您可以使用一些xslt为该元素生成xpath并使其成为链接的一部分。我用它(Jeni Tennison在几年前发布的XSL-List)
<xsl:for-each select="ancestor-or-self::*">
<xsl:text />/<xsl:value-of select="name()" />
<xsl:text />[<xsl:number />]<xsl:text />
</xsl:for-each>
完成后,您将拥有xml的可视化呈现(更像是MSIE和Firefox提供的视图),但还有其他链接返回到您的应用程序。然后,您的用户可以选择感兴趣的节点。然后,他们为您提供了所需的x路径,而无需实际自行编写。
如果你有xpaths生成xslt要容易得多。托马利克的上述建议似乎是一种有效的方式。如果你实际上不需要xml作为最终输出,那么你可能最好只使用一个xml解析器,它允许你选择给定xpath的节点。
如果您收到的信息当然包含任意数量的记录,这将变得更加复杂。如果是这种情况,您可以使用多阶段方法并使用我上面粗略推出的技术从输入中提取记录,然后使用该方法识别记录中的各个字段。
答案 2 :(得分:0)
Altova MapForce是一种商业产品,用于将一个XML模式映射到另一个XML模式并生成XSL转换。
您可能希望查看他们的试用版,看看他们是如何解决这个相当复杂的问题的。