【问题标题】:xsl transformer in javascript?javascript中的xsl转换器?
【发布时间】:2017-08-29 19:26:15
【问题描述】:

我很难找到一个好的 Javascript 库来通过 XSL 将 XML(在本例中为 XSD)转换为 XML。我在网上找到了一些 Javascript 库,但它们都不起作用。我尝试在线转换它(通过'http://www.freeformatter.com/xsl-transformer.html'),这确实有效!但是当我使用 Javascript 库时,不幸的是它不起作用。我在这里做错了什么?

这是我现在拥有的代码:

<html>
<body>
<div id="output"></div>

<script type="text/javascript" src="jquery-1.11.3.min.js"></script>
<script type="text/javascript" src="jquery.xslt.js"></script>
<script type="text/javascript">
    $(function() {
        $('#output').xslt({xmlUrl: 'notworking.xsd', xslUrl: 'notworking.xsl'});
    });
</script>
</body>
</html>

“notworking.xsd”文件:

<xs:import schemaLocation="https://www.w3.org/2001/xml.xsd" namespace="http://www.w3.org/XML/1998/namespace"/>

<xs:element name="list">
    <xs:complexType>
        <xs:complexContent>
            <xs:extension>
                <xs:sequence>
                    <xs:element minOccurs="0" name="list.start" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:element>

“notworking.xsl”文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output method="xml" version="1.0" indent="yes" encoding="utf-8"/>

    <xsl:template match="xs:schema">
        <xsl:variable name="name" select="fn:distinct-values(.//xs:element/@name)"/>
        <xsl:variable name="schema" select="."/>
        <xsl:element name="xsd">
            <xsl:for-each select=".//xs:element[@name]">
                <xsl:sort select="@name"/>
                <xsl:apply-templates select="."/>
            </xsl:for-each>
        </xsl:element>
    </xsl:template>

    <xsl:template match="xs:element">
        <xsl:variable name="type" select="fn:tokenize(@type,':')[last()]"/>
        <xsl:variable name="base" select="fn:tokenize(ancestor::xs:schema/xs:complexType[@name=$type]/xs:complexContent/xs:extension/@base,':')[last()]"/>
        <xsl:element name="{@name}">
            <xsl:copy-of select="@minOccurs"/>
            <xsl:variable name="sequence" select="./xs:complexType/xs:sequence/xs:element|ancestor::xs:schema/xs:complexType[@name=$type]//xs:extension/xs:sequence/xs:element"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="text()">
        <xsl:if test="normalize-space() ne ''">
            <xsl:value-of select="."/>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

【问题讨论】:

  • 你说“它不起作用”是什么意思?错误是什么?你能创建一个显示错误的代码 sn-p 或 plunker 吗?
  • 我认为大多数浏览器(至少 FF 和 MSIE)中都有 xsl 引擎,不需要额外的 javascript 或调用某处
  • 这是一个 XSLT 2.0 样式表,而浏览器仅支持 XSLT 1.0,因此如果您想在浏览器中运行 XSLT 2.0,则需要查看 Saxon-CE 或 Saxon-JS。

标签: javascript xml xslt transformation


【解决方案1】:

您的样式表需要 XSLT 2.0 支持(例如,XSLT 1.0 中不存在 distinct-values() 函数)。

主要浏览器供应商提供的 XSLT 处理器仅支持 XSLT 1.0。

试试 Saxon-JS:它支持 XSLT 3.0。请参阅http://www.saxonica.com/saxon-js/index.xml(如果您可以阅读文档,那么您已经在浏览器中成功运行 Saxon-JS)。

【讨论】:

    猜你喜欢
    • 2012-05-24
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 2013-02-05
    • 2011-03-04
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多