Как я могу разрешить определяемые пользователем форматы файлов XML? - PullRequest
0 голосов
/ 29 апреля 2009

Я хочу разрешить пользователям загружать файлы с информацией о транзакциях в мое приложение. Я хочу, чтобы пользователи могли при этом использовать свой собственный формат файла (XML или CSV).

Поэтому перед дальнейшей обработкой мне потребуется преобразование их формата в мой формат. Я не хочу создавать этот XSLT вручную каждый раз, когда у пользователя появляется новый формат файла, поэтому я хочу создать пользовательский интерфейс для создания этого документа XSLT.

Это относительно просто для формата файла CSV. Пользователь говорит, что первый элемент отображается в поле x на моей стороне, второй элемент отображается в поле 7 и т. Д.

Ситуация усложняется, если формат файла - XML ​​с вложенными элементами и т. Д. Кто-нибудь знает о хорошей парадигме пользовательского интерфейса для этого? Любые примеры, которые я могу посмотреть в Интернете или в другом месте? Я предполагаю, что пользователь должен будет описать полный xpath как часть отображения, или, возможно, сначала загрузить XSD и использовать его для выбора элементов для отображения (после чего мне нужно будет сгенерировать XSLT).

Я ценю любые идеи.

Ответы [ 3 ]

1 голос
/ 29 апреля 2009

Если входной 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: "@name"
  • данные1: "данные1"
  • данные2: «данные1 / данные2» ​​

и 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>
0 голосов
/ 11 мая 2009

Altova MapForce - это коммерческий продукт для отображения одной XML-схемы на другую и генерации XSL-преобразования.

Возможно, вы захотите взглянуть на их пробную версию и посмотреть, как они решили эту довольно сложную проблему.

0 голосов
/ 29 апреля 2009

Если я правильно понимаю, вы думаете о пользовательском интерфейсе, необходимом для создания необходимого xslt. Я делаю предположение, что это веб-приложение. Один из подходов состоит в том, чтобы использовать xslt, который визуализирует входной xml как html (я обычно использую xmlverbatim ). Вы можете изменить этот xslt для создания ссылок на узлы. Кроме того, вы можете использовать xslt для генерации xpath для этого элемента и сделать эту часть ссылки. Я использую это (опубликовано Джени Теннисон в 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), но с дополнительными ссылками на ваше приложение. Затем ваши пользователи могут выбрать интересующие вас узлы. Затем они предоставили вам необходимые вам xpath без необходимости писать их самим.

Генерация xslt, если у вас есть xpaths, значительно проще. Предложение Томалека, представленное выше, кажется верным. Если на самом деле вам не нужен xml в качестве конечного результата, вам может быть лучше просто использовать xml-анализатор, который позволяет вам выбирать узлы с заданным xpath.

Это станет более сложным, если информация, которую вы получаете, конечно же, содержит произвольное количество записей. Если это так, вы можете использовать многоступенчатый подход и использовать технику, которую я описал выше, чтобы извлечь запись из входных данных, а затем использовать подход для идентификации отдельных полей в записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...