自动生成XSL文件

时间:2011-06-09 17:25:55

标签: c# xslt

我有一个mapper实用程序,它将输入XML节点映射到另一个节点(它不使用XSLT)。在运行时,它遍历XML节点并转换它。美化节点到节点转换器但效率不高,并且存在我们无法克服的性能障碍。好的部分是它编写了一个定义文件,列出了入站XML元素及其相应的转换名称。我想在.NET中编写一个工具,它将读取此定义文件并使用它自动生成XSLT。一旦它生成了XSLT,我就可以使用XSLTC对其进行编译,并在我的Web应用程序中使用反射来包含它以进行运行时转换。任何可以实现这一目标的想法,指导,建议或工具都非常感谢

以下是一个简化的示例

<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 :(得分:0)

有趣。从您的回复来看,并不完全清楚哪个部分很慢,但我同意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>
祝你好运