0

我有这个:

<Item name="Alpha">
    <Field name="CreationDateTime">2012-04-26</Field>
    <Field name="Material" readOnly="X"> Congress </Field>
</Item>
<Item name="Beta">
    <Field name="CreationDateTime">2012-05-26</Field>
    <Field name="Material" readOnly="X"> Democracy </Field>
</Item>
   .
   .
   .
 and so on...

我希望它以这种格式转换:

<Item name="Alpha">
   <CreationDateTime >2012-04-26</CreationDateTime>
   <Material readOnly="X"> Congress </Material>
</Item>
<Item name="Beta">
   <CreationDateTime >2012-05-26</CreationDateTime>
   <Material readOnly="X"> Democracy </Material>
</Item>
    .
    .
    .
and so on...

我需要在客户端执行此操作(即在 javascript 和 jQuery 中)。我可以为此使用一个 jQuery 插件(例如 Google 的 AJAXSLT)。问题是 - 我以前从未做过 XSLT(而且也使用过 javascript!),并且不知道如何去做。

4

1 回答 1

1

问题是 - 我以前从未做过 XSLT(而且也使用过 javascript!),并且不知道如何去做。

XSLT 是一种用于将 XML 文档转换为其他(主要是 XML,但也包括 HTML、纯文本等)文档的语言。您需要的是一个可以工作的输入 XML,一个应该应用于输入以获取输出的转换,以及一个 XSLT 处理器来完成它。

XSLT 处理器可以是一个工具、一个库、一些由框架或操作系统提供的功能,或者在这种情况下(使用 JavaScript)是一个浏览器。

您已经有了 XML 输入,因此您需要一个处理器和一个转换。不幸的是,处理器是特定于浏览器的(例如,Mozilla的XSLTProcessor ,IE 的ActiveX等),您需要编写代码来测试您正在使用的特定浏览器(例如,可以在本页的源代码中看到它)。

不过幸运的是,您不必这样做,因为您提到的 Google AJAXSLT 之类的 javascript 库隐藏了下面的细节并公开了一个可以跨浏览器使用的统一 API。所以现在您只需要编写一个 XSL 文件来进行转换。

根据您的样本,如果输入是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<Items>
    <Item name="Alpha">
        <Field name="CreationDateTime">2012-04-26</Field>
        <Field name="Material" readOnly="X">Congress</Field>
    </Item>
    <Item name="Beta">
        <Field name="CreationDateTime">2012-05-26</Field>
        <Field name="Material" readOnly="X">Democracy</Field>
    </Item>
</Items>

使用这样的 XSL:

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

    <xsl:template match="/">
        <Items>
            <xsl:apply-templates />
        </Items>
    </xsl:template>

    <xsl:template match="Item">
        <Item>
            <xsl:attribute name="name">
                <xsl:value-of select="@name" />
            </xsl:attribute>
            <xsl:apply-templates />
        </Item>
    </xsl:template>

    <xsl:template match="Field">
        <xsl:variable name="fieldName" select="@name" />
        <xsl:element name="{$fieldName}">
            <xsl:if test="@readOnly">
                <xsl:copy-of select="@readOnly" />
            </xsl:if>
            <xsl:value-of select="." />
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

你得到这个:

<?xml version="1.0" encoding="UTF-8"?>
<Items>
    <Item name="Alpha">
        <CreationDateTime>2012-04-26</CreationDateTime>
        <Material readOnly="X">Congress</Material>
    </Item>
    <Item name="Beta">
        <CreationDateTime>2012-05-26</CreationDateTime>
        <Material readOnly="X">Democracy</Material>
    </Item>
</Items>

希望这能让您更快地开始在 javascript 中执行 XSLT。

最后,请确保您专注于 XSLT 1.0,因为浏览器尚不支持 2.0。

于 2012-10-21T14:15:15.097 回答