首页 文章

来自'Template XML'的XSLT

提问于
浏览
0

因此,我试图找出如何从MS Access导出,以便生成的XML具有相同的元素名称和节点,而不是来自另一个源...我还没有成功..

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

如果有人能帮助我,因为我已经尝试并且未能整天编码XSLT以获得我需要的东西?

基本上,我需要创建一个XSLT,它将所有XML导出转换为具有相同的Element名称,以及我的'Template 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 to 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>

所以我需要......

一个 . 将'dataroot'更改为'DatabaseData'b . 删除'Generated'节点,同时删除Access导出后放置的'xlmns:od' .

任何帮助将不胜感激!

1 回答

  • 0

    我相信你的样式表可以压缩到:

    <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 ,否则处理器将保留名称空间声明,以防需要进一步下游 .

相关问题