Автогенерация файла XSL - PullRequest
0 голосов
/ 09 июня 2011

У меня есть утилита mapper, которая отображает входные XML-узлы на другие узлы (она не использует XSLT).Во время выполнения он обходит узлы XML и преобразует его.Прославленный преобразователь узлов в узлы, но неэффективный и имеет барьер производительности, который мы не можем преодолеть.Хорошая часть заключается в том, что он пишет файл определения, в котором перечислены входящие XML-элементы и соответствующие им имена преобразований.Я хотел бы написать инструмент в .NET, который будет читать этот файл определения и автоматически генерировать XSLT с ним.Как только он сгенерирует XSLT, я могу скомпилировать его с помощью XSLTC и включить его, используя отражение в моих веб-приложениях для преобразований во время выполнения.Любые идеи, рекомендации, предложения или инструменты, доступные для этого, высоко ценятся

Ниже приведен упрощенный пример

<order><order_id>12345</order_id><customer>Cust1</customer></order>

файл определения

[Header]
order=customer_order
[Fields]
order_id=order_number
customer=customer_number

Запуск инструментапреобразование с использованием файла определения и генерировать ниже XML после преобразования

<customer_order><order_number>12345</order_number><customer_number>Cust1</customer_number></customer_order>

1 Ответ

0 голосов
/ 19 августа 2011

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

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

Подход XSLT запускается и строится из шаблона идентификации (который копирует один XML в другой), а затем добавляет шаблоны для преобразования по мере необходимости.Вам просто нужно пройтись по своим правилам и создать для каждого из них.

Вот пример шаблона идентификации с добавлением 3 правил.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<!-- order=customer_order -->
<xsl:template match="order">
    <customer_order><xsl:apply-templates select="@*|node()"/></customer_order>
</xsl:template>

<xsl:template match="order_id">
    <order_number><xsl:apply-templates select="@*|node()"/></order_number>
</xsl:template>

<xsl:template match="customer">
    <customer_number><xsl:apply-templates select="@*|node()"/></customer_number>
</xsl:template>

<xsl:template match="@*|node()">
    <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

И полученный XML

<?xml version="1.0"?>
<customer_order>
    <order_number>12345</order_number>
    <customer_number>Cust1</customer_number>
</customer_order>

Удачи

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