【问题标题】:XSLT from a 'Template XML'来自“模板 XML”的 XSLT
【发布时间】:2014-07-29 19:28:33
【问题描述】:

所以试图弄清楚如何从 MS Access 导出,因此生成的 XML 具有与来自另一个来源的相同的元素名称和节点..我没有成功..

所以我正在考虑从 MS Access 导出到 XML,然后使用 XSLT 转换文件中的数据以便读取。

如果有人可以帮助我,因为我整天都在尝试编写 XSLT 代码以得到我需要的东西,但失败了??

基本上,我需要创建一个 XSLT,它将所有 XML 导出转换为具有与我的“模板 XML”中相同的元素名称和节点

我的模板 XML 如下...

<DatabaseData>
<Customers>
 <Idx>0</Idx>
 <FirstName/>
 <LastName>Undefined</LastName>
 <IconIdx>0</IconIdx>
 <PhoneNumber/>
 <Email/>
 <Street/>
 <City/>
 <State/>
 <ZipCode/>
 <Available>1</Available>
 <SPIndex>0</SPIndex>
 </Customers>
 </DatabaseData>

//编辑// 道歉..

我曾尝试创建自己的 XSLT,但我觉得它缺少它..

<xsl:stylesheet version="1.0">

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

<xsl:template match="/">
<xsl:element name="DatabaseData">
    <xsl:element name="Customers">
        <Idx><xsl:value-of select="Idx" /></Idx>
        <FirstName><xsl:value-of select="FirstName" /></FirstName>
        <LastName><xsl:value-of select="LastName" /></LastName>
        <IconIdx><xsl:value-of select="IconIdx" /></IconIdx>
        <PhoneNumber><xsl:value-of select="PhoneNumber" /></PhoneNumber>
        <Email><xsl:value-of select="Email" /></Email>
        <Street><xsl:value-of select="Street" /></Street>
        <City><xsl:value-of select="City" /></City>
        <State><xsl:value-of select="State" /></State>
        <ZipCode><xsl:value-of select="ZipCode" /></ZipCode>
        <Available><xsl:value-of select="Available" /></Available>
        <SPIndex><xsl:value-of select="SPIndex" /></SPIndex>
    </Customers>
</DatabaseData>
</xsl:template>
</xsl:stylesheet>

Access 到 XML 的输出信息如下:

<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2014-07-    29T14:28:34">
<Customers>
 <Idx>1</Idx>
 <FirstName>David</FirstName>
 <LastName>James</LastName>
 <IconIdx>0</IconIdx>
 <PhoneNumber>00000 000000</PhoneNumber>
 <Email>david@email.com</Email>
 <Street/>
 <City>London</City>
 <State>London</State>
 <ZipCode>AB3 CD4</ZipCode>
 <Available>0</Available>
 <SPIndex>0</SPIndex>
 </Customers>
</dataroot>

所以我需要..

一个。将“数据根”更改为“数据库数据” 湾。删除“生成”节点,同时删除 Access 在导出后放置的“xlmns:od”。

任何帮助将不胜感激!

【问题讨论】:

    标签: xml templates xslt export


    【解决方案1】:

    我相信您的样式表可以压缩为:

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:template match="/">
        <DatabaseData>
            <xsl:copy-of select="dataroot/Customers"/>
        </DatabaseData>
    </xsl:template>
    
    </xsl:stylesheet>
    

    --

    ...同时还删除了 Access 放置的“xlmns:od” 导出后..

    我没有在您的输入中看到该部分。


    编辑:

    要删除(无害的)命名空间声明,您需要执行以下操作:

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    
    <xsl:template match="/">
        <DatabaseData>
            <xsl:for-each select="dataroot/Customers">
                <Customers>
                    <Idx><xsl:value-of select="Idx"/></Idx>
                    <FirstName><xsl:value-of select="FirstName"/></FirstName>
                    <LastName><xsl:value-of select="LastName"/></LastName>
                    <IconIdx><xsl:value-of select="IconIdx"/></IconIdx>
                    <PhoneNumber><xsl:value-of select="PhoneNumber"/></PhoneNumber>
                    <Email><xsl:value-of select="Email"/></Email>
                    <Street><xsl:value-of select="Street"/></Street>
                    <City><xsl:value-of select="City"/></City>
                    <State><xsl:value-of select="State"/></State>
                    <ZipCode><xsl:value-of select="ZipCode"/></ZipCode>
                    <Available><xsl:value-of select="Available"/></Available>
                    <SPIndex><xsl:value-of select="SPIndex"/></SPIndex>
                </Customers>
            </xsl:for-each>
        </DatabaseData>
    </xsl:template>
    
    </xsl:stylesheet>
    

    或者,如果您更喜欢更通用的解决方案:

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    
    <xsl:template match="/">
        <DatabaseData>
            <Customers>
                <xsl:for-each select="dataroot/Customers/*">
                    <xsl:element name="{local-name()}">
                        <xsl:value-of select="."/>
                    </xsl:element>
                </xsl:for-each>
            </Customers>
        </DatabaseData>
    </xsl:template>
    
    </xsl:stylesheet>
    

    IOW,您不能使用copycopy-of,否则处理器将保留命名空间声明,以备下游需要时使用。

    【讨论】:

    • 我已编辑输出的 xml 信息以包括 xmlns 包含在 xml 中的位置
    • @Davidskibob 这是一个无害的声明,你不应该介意。只有当您费力地明确列出所有输出元素以及它们需要从中获取值的输入元素时,才能删除它 - 您已经开始这样做了。
    • 感谢您的帮助!关于 xmlns .. 对于我用来读取文件的机器帽子,它不能有 xmlns 否则它将无法正确读取 xml!
    • 这很烦人,但宁愿这样做,但为机器编写程序的人显然感觉很讨厌!哈哈
    • @Davidskibob 无能是我的猜测...请参阅我的帖子的编辑。
    猜你喜欢
    • 2017-12-16
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    • 2021-08-12
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多