【问题标题】:How can I allow for user definable XML file formats?如何允许用户定义 XML 文件格式?
【发布时间】:2009-04-28 22:18:44
【问题描述】:

我希望允许用户将包含交易信息的文件上传到我的应用程序。我希望用户在这样做时能够使用自己的文件格式(XML 或 CSV)。

因此,在进行进一步处理之前,我需要将它们的格式转换为我的格式。我不想每次用户有新的文件格式时都手动创建这个 XSLT,所以我想创建一个 UI 来实质上构建这个 XSLT 文档。

这对于 CSV 文件格式来说相对容易。用户说第一个元素映射到我这边的 x 字段,第二个元素映射到 7 字段等。

当文件格式是带有嵌套元素的 XML 等时,这会变得更加复杂。有人知道这样做的良好 UI 范例吗?我可以在网络或其他地方查看任何示例吗?我想用户必须将完整的 xpath 描述为映射的一部分,或者可能首先上传 XSD 并使用它来选择映射元素(之后我需要生成 XSLT)。

我很欣赏任何想法。

【问题讨论】:

  • 您想使用 XSLT 将 CSV 转换为 XML?这将如何运作?
  • 好吧,可能有一个中间步骤...创建一个具有平面结构的 XML 文档,然后将 XSLT 应用到那个...

标签: xml user-interface xslt


【解决方案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>

那么用户必须提供以下映射:

  • 根元素:“根”
  • 记录元素:“条目”
  • id:“@id”
  • 姓名:“@name”
  • 数据1:“数据1”
  • data2:“data1/data2”

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>

【讨论】:

    【解决方案2】:

    如果我理解正确,您正在考虑创建所需的 xslt 所需的 UI。我假设这是一个基于 Web 的应用程序。一种方法是使用将输入 xml 呈现为 html 的 xslt(我倾向于使用的是 xmlverbatim)。您可以修改此 xslt 以创建到节点的链接。此外,您可以使用一些 xslt 为该元素生成 xpath 并使这部分成为链接。我使用这个(多年前由 Jeni Tennison 发布到 XSL 列表)

      <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 提供的视图),但带有返回应用程序的附加链接。然后,您的用户可以选择感兴趣的节点。然后,他们为您提供了所需的 xpath,而无需自己实际编写。

    如果你有 xpath,生成 xslt 会容易得多。 Tomalek 上面的建议似乎是一种有效的方法。如果您实际上不需要 xml 作为最终输出,则最好使用 xml 解析器,该解析器允许您选择给定 xpath 的节点。

    如果您收到的信息当然包含任意数量的记录,这将变得更加复杂。如果是这种情况,您可以使用多阶段方法并使用我在上面粗略介绍的技术从输入中提取记录,然后使用该方法来识别记录中的各个字段。

    【讨论】:

      【解决方案3】:

      Altova MapForce 是一种商业产品,用于将一个 XML 模式映射到另一个模式并生成 XSL 转换。

      您可能想看看他们的试用版,看看他们如何解决这个相当复杂的问题。

      【讨论】:

        猜你喜欢
        • 2016-12-04
        • 1970-01-01
        • 1970-01-01
        • 2021-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-23
        相关资源
        最近更新 更多