gpt4 book ai didi

xslt - 有没有办法基于XSD文件动态创建XSL文件

转载 作者:行者123 更新时间:2023-12-04 17:38:56 24 4
gpt4 key购买 nike

我有一个项目,我需要将 XML 文件转换为 CSV 文件,反之亦然。我不能使用单个 XSL 文件,因为有不同的 XML 和 CSV 格式。所以,我只是想知道是否有任何方法(任何工具或编辑器或任何 API)可以基于 XSD 文件创建 XSL 文件。

我也愿意接受任何其他建议(我相信我无法避免使用 XSL,因为将来我可能会被要求转换为不同的格式,例如 pdf、html 等)

最佳答案

我意识到这是在 3 年前被问到并得到了很好的回答,但我在问自己同样的问题时遇到了它。简短的回答当然是肯定的,因为您只是将一种类型的 XML 转换为另一种类型(尽管进行了一些结构和语法更改)。我看到了这个:https://www.oxygenxml.com/archives/xsl-list/200807/msg00601.html - 它概述了作为概念证明的基本实现,我以此为起点创建了以下 XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output indent="yes" method="xml" />

<xsl:template match="/">
<xsl:comment> ............................................................................................... </xsl:comment>

<xsl:element name="xsl:stylesheet">
<xsl:namespace name="xsl" select="'http://www.w3.org/1999/XSL/Transform'" /> <xsl:attribute name="version" select="'1.0'" />

<xsl:element name="xsl:output">
<xsl:attribute name="indent" select="'yes'" />
<xsl:attribute name="method" select="'xml'" />
</xsl:element>

<xsl:comment> ............................................................................................... </xsl:comment>
<xsl:comment> </xsl:comment>
<xsl:comment> ............................................................................................... </xsl:comment>

<xsl:element name="xsl:template">
<xsl:attribute name="match" select="'/'" />
<xsl:element name="xsl:apply-templates">
<xsl:attribute name="select" select="'node()'" />
</xsl:element>
</xsl:element>

<xsl:comment> ............................................................................................... </xsl:comment>

<xsl:element name="xsl:template">
<xsl:attribute name="match" select="'node()'" />
<xsl:element name="xsl:if">
<xsl:attribute name="test" select="'.!=&apos;&apos;'" />
<xsl:element name="xsl:copy"></xsl:element>
</xsl:element>
</xsl:element>

<xsl:comment> ............................................................................................... </xsl:comment>
<xsl:comment> </xsl:comment>
<xsl:comment> ............................................................................................... </xsl:comment>

<xsl:apply-templates />
</xsl:element>

<xsl:comment> ............................................................................................... </xsl:comment>
</xsl:template>

<xsl:template match="xs:complexType[@name]">
<xsl:element name="xsl:template">
<xsl:attribute name="match" select="@name" />
<xsl:apply-templates />
</xsl:element>
<xsl:comment> ............................................................................................... </xsl:comment>
</xsl:template>

<xsl:template match="xs:complexType[not(@*)]">
<xsl:element name="xsl:apply-templates">
<xsl:attribute name="select" select="@name" />
<xsl:apply-templates />
</xsl:element>
</xsl:template>

<!-- xsl:template match="xs:simpleType[@name]">
<xsl:element name="xsl:apply-templates">
<xsl:attribute name="select" select="@name" />
<xsl:apply-templates />
</xsl:element>
</xsl:template -->

<xsl:template match="xs:sequence">
<xsl:element name="xsl:copy">
<xsl:apply-templates />
</xsl:element>
</xsl:template>

<xsl:template match="xs:element[@name]">
<xsl:element name="xsl:apply-templates">
<xsl:attribute name="select" select="@name" />
</xsl:element>
</xsl:template>

<xsl:template match="xs:attribute">
<xsl:element name="xsl:apply-templates">
<xsl:attribute name="select" select="concat( '@', @name )" />
</xsl:element>
</xsl:template>

<!-- xsl:template match="xs:element[@name]">
<xsl:text>&#xA;&#xA;</xsl:text>
<xsl:element name="xsl:template">
<xsl:attribute name="match" select="@name" />
<xsl:text>&#xA;</xsl:text>
<xsl:comment>
auto generated stub for element <xsl:value-of select="@name" />
</xsl:comment>
<xsl:text>&#xA;</xsl:text>
</xsl:element>
<xsl:apply-templates />
</xsl:template -->

<xsl:template match="text()" />

</xsl:stylesheet>

注意使用 xsl:element创建 XSLT 标记并创建 selectmatch属性,选择和转义中的引用。 comment块用于在视觉上分解文档的根(使其更具可读性),但没有其他用途。此外,这需要 XSLT 2.0 处理器。 xsltproc用户无需申请。

根据之前的回复,您必须针对您的用例在不同程度上修改它。我这样做是为了我可以快速创建一个准确的骨架,我可以从中构建一个有用的 XSLT 文档,同时自动化繁琐的基础工作。

当然,我刚刚花了几个小时来开发和测试一些东西,在这一点上我可能可以用 grep 手动完成更快,但至少它很有趣。希望这对某人有所帮助,欢迎改进。

关于xslt - 有没有办法基于XSD文件动态创建XSL文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9254066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com